augeas 0.1.2 → 0.2.0
raw patch · 5 files changed
+484/−25 lines, 5 filesdep +directorydep −haskell98dep ~basePVP ok
version bump matches the API change (PVP)
Dependencies added: directory
Dependencies removed: haskell98
Dependency ranges changed: base
API changes (from Hackage documentation)
- System.Augeas: data AugBefore
- System.Augeas: data AugFlag
- System.Augeas: data AugRet
+ System.Augeas: AugBefore :: CInt -> AugBefore
+ System.Augeas: AugErrCode :: CInt -> AugErrCode
+ System.Augeas: AugFlag :: CInt -> AugFlag
+ System.Augeas: AugRet :: CInt -> AugRet
+ System.Augeas: aug_defnode :: Ptr Augeas -> ByteString -> ByteString -> ByteString -> IO (AugRet, Maybe Bool)
+ System.Augeas: aug_defvar :: Ptr Augeas -> ByteString -> (Maybe ByteString) -> IO (AugRet)
+ System.Augeas: aug_error :: Ptr Augeas -> IO (AugErrCode)
+ System.Augeas: aug_error_details :: Ptr Augeas -> IO (ByteString)
+ System.Augeas: aug_error_message :: Ptr Augeas -> IO (ByteString)
+ System.Augeas: aug_error_minor_message :: Ptr Augeas -> IO (ByteString)
+ System.Augeas: aug_load :: Ptr Augeas -> IO (AugRet)
+ System.Augeas: err_bad_path :: AugErrCode
+ System.Augeas: err_internal :: AugErrCode
+ System.Augeas: err_multi_matches :: AugErrCode
+ System.Augeas: err_multi_xfm :: AugErrCode
+ System.Augeas: err_no_lens :: AugErrCode
+ System.Augeas: err_no_match :: AugErrCode
+ System.Augeas: err_no_memory :: AugErrCode
+ System.Augeas: err_syntax :: AugErrCode
+ System.Augeas: newtype AugBefore
+ System.Augeas: newtype AugErrCode
+ System.Augeas: newtype AugFlag
+ System.Augeas: newtype AugRet
+ System.Augeas: no_error :: AugErrCode
+ System.Augeas: no_load :: AugFlag
+ System.Augeas: no_modl_autoload :: AugFlag
+ System.Augeas: no_stdinc :: AugFlag
+ System.Augeas: one :: AugRet
+ System.Augeas: save_noop :: AugFlag
+ System.Augeas: unAugErrCode :: AugErrCode -> CInt
+ System.Augeas: unAugFlag :: AugFlag -> CInt
Files
- AUTHORS +7/−0
- HUnitAug.hs +220/−12
- System/Augeas.hs +231/−11
- System/AugeasHsc.hsc +23/−0
- augeas.cabal +3/−2
+ AUTHORS view
@@ -0,0 +1,7 @@+Written by:+ +Jude Nagurney <jude@pwan.org>++Contributions by:++Gwern Branwen <gwen0@gmail.com>
HUnitAug.hs view
@@ -27,11 +27,12 @@ import Data.ByteString.Char8 import Foreign+import Foreign.C.Types import Foreign.ForeignPtr -import Directory+import System.Directory import Data.List (isInfixOf)-import IO+import System.IO as IO -- constants bs_BadPath = (Data.ByteString.Char8.pack "/files/bad/path")@@ -47,6 +48,101 @@ Nothing -> assertFailure "aug_ptr shouldn't be nothing in with_augptr" Just aug_fp -> (withForeignPtr aug_fp $ \aug_ptr -> func aug_ptr) +-- ----------------+-- aug_defvar tests+-- ----------------+testBadDefVar :: Test+testBadDefVar = TestCase ( with_augptr $ \aug_ptr -> do+ ret_defvar <- aug_defvar aug_ptr (Data.ByteString.Char8.pack "var") (Just (Data.ByteString.Char8.pack "$undefined"))+ assertEqual "testBadDefVar " System.Augeas.error ret_defvar++ ret_error <- aug_error aug_ptr+ assertEqual "testBadDefVar error" err_bad_path ret_error++ )++testGoodDefVar :: Test+testGoodDefVar = TestCase ( with_augptr $ \aug_ptr -> do+ ret_defvar <- aug_defvar aug_ptr (Data.ByteString.Char8.pack "var") (Just (Data.ByteString.Char8.pack "/files/etc/hosts"))+ assertEqual "testGoodDefVar (1)" one ret_defvar++ ret_get <- aug_get aug_ptr (Data.ByteString.Char8.pack "$var/1/canonical")+ assertEqual "testGoodDefVar: Should have gotten localhost" (Right (Just "localhost")) ret_get+ )++testReplaceDefVar :: Test +testReplaceDefVar = TestCase ( with_augptr $ \aug_ptr -> do+ ret_defvar <- aug_defvar aug_ptr (Data.ByteString.Char8.pack "var") (Just (Data.ByteString.Char8.pack "/files/etc/hosts/1/canonical"))+ assertEqual "testReplaceDefVar" one ret_defvar++ ret_get <- aug_get aug_ptr (Data.ByteString.Char8.pack "$var")+ assertEqual "testReplaceDefVar: Should have gotten localhost" (Right (Just "localhost")) ret_get++ ret_defvar <- aug_defvar aug_ptr (Data.ByteString.Char8.pack "var") (Just (Data.ByteString.Char8.pack "/files/etc/hosts/1/ipaddr"))+ assertEqual "testReplaceDefVar (2)" one ret_defvar++ ret_get <- aug_get aug_ptr (Data.ByteString.Char8.pack "$var")+ assertEqual "testReplaceDefVar: Should have gotten 127.0.0.1" (Right (Just "127.0.0.1")) ret_get++ )++testNullValueDefVar ::Test +testNullValueDefVar = TestCase ( with_augptr $ \aug_ptr -> do+ ret_defvar <- aug_defvar aug_ptr (Data.ByteString.Char8.pack "var") (Just (Data.ByteString.Char8.pack "/files/etc/hosts/1/canonical"))+ assertEqual "testNullDefVar (1)" one ret_defvar++ ret_get <- aug_get aug_ptr (Data.ByteString.Char8.pack "$var")+ assertEqual "testNullDefVar: Should have gotten localhost (1)" (Right (Just "localhost")) ret_get++ ret_defvar <- aug_defvar aug_ptr (Data.ByteString.Char8.pack "var") Nothing+ assertEqual "testNullDefVar (2)" success ret_defvar++ ret_get <- aug_get aug_ptr (Data.ByteString.Char8.pack "$var")+ assertEqual "testNullDefVar: Should have gotten localhost (2)" (Left invalid_match) ret_get++ )++testNonZeroDefVar :: Test+testNonZeroDefVar = TestCase ( with_augptr $ \aug_ptr -> do+ ret_defvar <- aug_defvar aug_ptr (Data.ByteString.Char8.pack "var") (Just (Data.ByteString.Char8.pack "/files/etc/hosts/*"))+ assertEqual "testGoodDefVar (1)" (AugRet 12) ret_defvar++ )++-- -----------------+-- aug_defnode tests+-- -----------------++testBadDefNode :: Test+testBadDefNode = TestCase ( with_augptr $ \aug_ptr -> do+ ret_defnode <- aug_defnode aug_ptr (Data.ByteString.Char8.pack "var") (Data.ByteString.Char8.pack "$undefined") (Data.ByteString.Char8.pack "haskell-augeas.org")+ assertEqual "testBadDefNode" (System.Augeas.error, Nothing) ret_defnode++ ret_error <- aug_error aug_ptr+ assertEqual "testBadDefNode error" err_bad_path ret_error++ )++testDefNode :: Test+testDefNode = TestCase ( with_augptr $ \aug_ptr -> do+ ret_defvar <- aug_defnode aug_ptr (Data.ByteString.Char8.pack "var") (Data.ByteString.Char8.pack "/files/etc/hosts/1000/canonical") (Data.ByteString.Char8.pack "haskell-augeas.org")+ assertEqual "defnode (1)" ((AugRet 1),(Just True)) ret_defvar+ ret_get <- aug_get aug_ptr (Data.ByteString.Char8.pack "$var")+ assertEqual "defnode (2)" (Right (Just "haskell-augeas.org")) ret_get++ -- The node already exists, so it should not be set to the new value+ ret_defvar <- aug_defnode aug_ptr (Data.ByteString.Char8.pack "bar") (Data.ByteString.Char8.pack "/files/etc/hosts/1000/canonical") (Data.ByteString.Char8.pack "haskell-augeas2.org")+ assertEqual "defnode (3)" ((AugRet 1),(Just False)) ret_defvar+ ret_get <- aug_get aug_ptr (Data.ByteString.Char8.pack "$bar")+ assertEqual "defnode(4)" (Right (Just "haskell-augeas.org")) ret_get+ )++--testNonZeroDefNode :: Test+--testNonZeroDefNode = TestCase ( with_augptr $ \aug_ptr -> do+-- ret_defnode <- aug_defnode aug_ptr (Data.ByteString.Char8.pack "var") (Data.ByteString.Char8.pack "/files/etc/hosts") (Data.ByteString.Char8.pack "unset")+-- assertEqual "testNonZeroDefVar (1)" ((AugRet 12),(Just False)) ret_defnode+-- )+ -- ------------- -- aug_get tests -- -------------@@ -85,12 +181,12 @@ testGetMultipleLabel = TestCase ( with_augptr $ \aug_ptr -> do ret_get <- aug_get aug_ptr (Data.ByteString.Char8.pack "/files/etc/hosts/*/canonical") assertEqual "Get should return a negative on multiple matches" (Left invalid_match) ret_get- )+ ) testGetBadMultipleLabel :: Test testGetBadMultipleLabel = TestCase ( with_augptr $ \aug_ptr -> do ret_get <- aug_get aug_ptr (Data.ByteString.Char8.pack "/files/etc/hosts/*/invalid")- assertEqual "Get should return a negative on multiple matches" (Left invalid_match) ret_get+ assertEqual "Get should return a negative on multiple matches (2)" (Left no_match) ret_get ) -- -------------@@ -109,6 +205,10 @@ testSetMultiMatch = TestCase ( with_augptr $ \aug_ptr -> do ret_set <- aug_set aug_ptr (Data.ByteString.Char8.pack "/files/etc/hosts/*/canonical") (Data.ByteString.Char8.pack "haskell-augeas.org") assertEqual "set OK" System.Augeas.error ret_set++ ret_error <- aug_error aug_ptr+ assertEqual "testSetMultiMatch error" no_error ret_error+ ) -- ----------------@@ -118,12 +218,20 @@ testInsertBadPath = TestCase ( with_augptr $ \aug_ptr -> do ret_insert <- aug_insert aug_ptr bs_BadPath (Data.ByteString.Char8.pack "label") just_after assertEqual "Bad path in insert" System.Augeas.error ret_insert++ ret_error <- aug_error aug_ptr+ assertEqual "testInsertBadPath error" err_no_match ret_error+ ) testInsertMultiMatch :: Test testInsertMultiMatch = TestCase ( with_augptr $ \aug_ptr -> do ret_insert <- aug_insert aug_ptr (Data.ByteString.Char8.pack "/files/etc/hosts/*/canonical") (Data.ByteString.Char8.pack "label") just_after assertEqual "No multimatches on insert" System.Augeas.error ret_insert++ ret_error <- aug_error aug_ptr+ assertEqual "testInsertMultiMatch error" err_multi_matches ret_error+ ) testInsertBeforeAfter :: Test@@ -148,7 +256,7 @@ testRmBadPath :: Test testRmBadPath = TestCase ( with_augptr $ \aug_ptr -> do ret_rm <- aug_rm aug_ptr bs_BadPath- assertEqual "Bad path in rm" 0 ret_rm+ assertEqual "Bad path in rm 1" 0 ret_rm ) testRmOne :: Test@@ -179,6 +287,10 @@ testMvBadSrc = TestCase ( with_augptr $ \aug_ptr -> do ret_mv <- aug_mv aug_ptr bs_BadPath (Data.ByteString.Char8.pack "/files/etc/hosts/1/badpath") assertEqual "mv bad src" System.Augeas.error ret_mv++ ret_error <- aug_error aug_ptr+ assertEqual "testMvBadSrc error" err_no_match ret_error+ ) testMvNewDest :: Test@@ -244,20 +356,47 @@ contents <- Prelude.readFile (cwd++"/testroot/etc/hosts.augnew") assertEqual "Check augnew" (Data.List.isInfixOf "192.168.1.234\thaskell-augeas.org" contents) True + removeFile (cwd++"/testroot/etc/hosts.augnew")+ ret_rm <- aug_rm aug_ptr (Data.ByteString.Char8.pack "/files/etc/hosts/1000")- assertEqual "Bad path in rm" 3 ret_rm+ assertEqual "Bad path in rm 2" 3 ret_rm ret_save <- aug_save aug_ptr assertEqual "save good" success ret_save - contents <- Prelude.readFile (cwd++"/testroot/etc/hosts.augnew")- assertEqual "Check augnew" (Data.List.isInfixOf "192.168.1.234\thaskell-augeas.org" contents) False+ -- removing the /file/etc/hosts/10 entry will put /etc/hosts back to its original state, so nothing will be written out+ -- so the augnew file shouldn't exist+ b_AugnewExists <- doesFileExist (cwd++"/testroot/etc/hosts.augnew")+ assertEqual "No augnew" b_AugnewExists False ) --- ------------ aug_print--- ---------+-- --------------+-- aug_load tests+-- --------------+testLoad :: Test+testLoad = TestCase ( with_augptr $ \aug_ptr -> do++ cwd <- getCurrentDirectory++ renameFile (cwd++"/testroot/etc/hosts") (cwd++"/testroot/etc/hosts.orig")+ renameFile (cwd++"/testroot/etc/hosts.reload") (cwd++"/testroot/etc/hosts")+ + ret_load <- aug_load aug_ptr+ assertEqual "testLoad (1)" success ret_load++ -- Verify the new entry was loaded+ ret_get <- aug_get aug_ptr (Data.ByteString.Char8.pack "/files/etc/hosts/10/ipaddr")+ assertEqual "testLoad (2)" (Right (Just "192.168.0.203")) ret_get++ renameFile (cwd++"/testroot/etc/hosts") (cwd++"/testroot/etc/hosts.reload")+ renameFile (cwd++"/testroot/etc/hosts.orig") (cwd++"/testroot/etc/hosts")++ )++-- ---------------+-- aug_print tests+-- --------------- testPrint :: Test testPrint = TestCase ( with_augptr $ \aug_ptr -> do cwd <- getCurrentDirectory@@ -275,10 +414,69 @@ ) +-- ---------------+-- aug_error tests+-- ---------------+testError :: Test+testError = TestCase ( with_augptr $ \aug_ptr -> do ++ ret_err <- aug_error aug_ptr + assertEqual ("testError") no_error ret_err+ ++ )++-- ----------------+-- aug_error* tests+-- ----------------+testErrMessage :: Test+testErrMessage = TestCase ( with_augptr $ \aug_ptr -> do+ ret_defvar <- aug_defvar aug_ptr (Data.ByteString.Char8.pack "var") (Just (Data.ByteString.Char8.pack "$undefined"))+ assertEqual "testErrMessage (1) " System.Augeas.error ret_defvar++ ret_error <- aug_error aug_ptr+ assertEqual "testErrMessage (2)" err_bad_path ret_error++ err_message <- aug_error_message aug_ptr+ assertEqual "testErrMessage (3)" (Data.ByteString.Char8.pack "Invalid path expression") err_message++ err_minor_message <- aug_error_minor_message aug_ptr+ assertEqual "testErrMessage (4)" (Data.ByteString.Char8.pack "undefined variable") err_minor_message++ err_details <- aug_error_details aug_ptr+ assertEqual "testErrMessage (4)" (Data.ByteString.Char8.pack "$undefined|=|") err_details+++ )++-- -----------------------+-- aug_error_message tests+-- -----------------------++-- -----------------------------+-- aug_error_minor_message tests+-- -----------------------------++-- -----------------+-- aug_error_details+-- -----------------+ main :: IO Counts main = runTestTT $ TestList [ -- testBadRoot, + -- aug_defvar+ testBadDefVar,+ testGoodDefVar,+ testReplaceDefVar,+ testNullValueDefVar,+ testNonZeroDefVar,+ + -- auf_defnode+ testBadDefNode,+ testDefNode,+-- testNonZeroDefNode,+ -- aug_get tests testGetBadPath, testGetPartialPath,@@ -315,8 +513,18 @@ testSave, testSaveNewLabel, + -- aug_load+ testLoad,+ -- aug_print tests- testPrint+ testPrint,++ -- aug_error+ -- aug_error_message+ -- aug_error_minor_message+ -- aug_error_details+ testError,+ testErrMessage -- aug_close already handled in ForeignPtr, so there's no need to surface it to Haskell users at all.
System/Augeas.hs view
@@ -31,16 +31,21 @@ ( -- * Types Augeas- , AugFlag,- none, save_backup, save_newfile, type_check+ , AugFlag(..)+ , none, save_backup, save_newfile, type_check, no_stdinc, save_noop, no_load, no_modl_autoload , AugMatch , exactly_one, no_match, invalid_match- , AugRet- , success, System.Augeas.error- , AugBefore+ , AugRet(..)+ , success, one, System.Augeas.error+ , AugBefore(..) , just_before, just_after+ , AugErrCode(..)+ , no_error, err_no_memory, err_internal, err_bad_path, err_no_match, err_multi_matches, err_syntax, err_no_lens, err_multi_xfm+ -- * Functions , aug_init+ , aug_defvar+ , aug_defnode , aug_get , aug_set , aug_insert@@ -48,7 +53,12 @@ , aug_mv , aug_match , aug_save+ , aug_load , aug_print+ , aug_error + , aug_error_message + , aug_error_minor_message+ , aug_error_details ) where import System.IO@@ -122,6 +132,9 @@ error :: AugRet error = AugRet (-1) +one :: AugRet+one = AugRet 1+ -- ---------- -- aug_before -- ----------@@ -208,6 +221,95 @@ --aug_close :: FinalizerPtr Augeas --aug_close = c_aug_close +-- ----------+-- aug_defvar+-- ----------+foreign import ccall unsafe "augeas.h aug_defvar"+ c_aug_defvar :: Ptr Augeas -- aug+ -> CString -- name+ -> CString -- expr+ -> IO (AugRet) -- return_value+{-| + Function: aug_defvar+ + Define a variable NAME whose value is the result of evaluating EXPR. If+ a variable NAME already exists, its name will be replaced with the+ result of evaluating EXPR.+ + If EXPR is Nothing, the variable NAME will be removed if it is defined.+ + Path variables can be used in path expressions later on by prefixing+ them with '$'.+ + Returns -1 on error; on success, returns 0 if EXPR evaluates to anything+ other than a nodeset, and the number of nodes if EXPR evaluates to a+ nodeset+-}+aug_defvar :: Ptr Augeas -- ^ Augeas pointer+ -> ByteString -- ^ NAME+ -> (Maybe ByteString) -- ^ Maybe EXPR+ -> IO (AugRet) -- ^ AugRet+aug_defvar aug_ptr bstr1 (Just bstr2) = + useAsCString bstr1 $ \name -> do+ useAsCString bstr2 $ \expr -> do+ ret <- c_aug_defvar aug_ptr name expr+ return ret++aug_defvar aug_ptr bstr1 Nothing = + useAsCString bstr1 $ \name -> do+ ret <- c_aug_defvar aug_ptr name nullPtr+ return ret++-- -----------+-- aug_defnode+-- -----------+foreign import ccall unsafe "augeas.h aug_defnode"+ c_aug_defnode :: Ptr Augeas -- aug+ -> CString -- name+ -> CString -- expr+ -> CString -- value+ -> Ptr CInt -- created+ -> IO (CInt) -- return_value+{-| + Function: aug_defnode++ Define a variable NAME whose value is the result of evaluating EXPR,+ which must be non-NULL and evaluate to a nodeset. If a variable NAME+ already exists, its name will be replaced with the result of evaluating+ EXPR.+ + If EXPR evaluates to an empty nodeset, a node is created, equivalent to+ calling AUG_SET(AUG, EXPR, VALUE) and NAME will be the nodeset containing+ that single node.+ + If CREATED is non-NULL, it is set to 1 if a node was created, and 0 if+ it already existed.+ + Returns -1 on error; on success, returns the number of nodes in the+ nodeset +-}+aug_defnode :: Ptr Augeas -- ^ Augeas pointer+ -> ByteString -- ^ NAME+ -> ByteString -- ^ EXPR+ -> ByteString -- ^ VALUE+ -> IO (AugRet,Maybe Bool) -- ^ (AugMatch,b_NodeCreated)+aug_defnode aug_ptr bstr1 bstr2 bstr3 = + useAsCString bstr1 $ \name -> do+ useAsCString bstr2 $ \expr -> do+ useAsCString bstr3 $ \value -> do+ alloca $ \created -> do+ ret <- c_aug_defnode aug_ptr name expr value created+ if ret /= -1 + then do+ i_created <- peek created+ if i_created == 0 + then do+ return ((AugRet ret), Just False)+ else do+ return ((AugRet ret), Just True)+ else do+ return ((AugRet ret), Nothing)+ -- ------- -- aug_get -- -------@@ -215,13 +317,15 @@ c_aug_get :: Ptr Augeas -- aug -> CString -- path -> Ptr CString -- value- -> IO (AugMatch) -- return_value+ -> IO (CInt) -- return_value {-| Lookup the value associated with PATH. VALUE can be NULL, in which case it is ignored. If VALUE is not NULL, it is used to return a pointer to the value associated with PATH if PATH matches exactly one node. If PATH- matches no nodes or more than one node, *VALUE is set to NULL.+ matches no nodes or more than one node, *VALUE is set to NULL. Note that+ it is perfectly legal for nodes to have a NULL value, and that that by + itself does not indicate an error. Return AugMatch.exactly_one if there is exactly one node matching PATH, AugMatch.no_match if there is none, and AugMatch.invalid_match if there is more than one node matching PATH, or if@@ -235,11 +339,11 @@ useAsCString bstr1 $ \path -> do alloca $ \value -> do ret <- c_aug_get aug_ptr path value- if ret == exactly_one+ if ret == 1 then do if value == nullPtr then do- return (Left ret)+ return (Left (AugMatch ret)) else do peeked <- peek value if peeked == nullPtr@@ -249,7 +353,7 @@ str_peeked <- peekCString peeked return (Right (Just str_peeked)) else do - return (Left ret)+ return (Left (AugMatch ret)) -- ------- -- aug_set@@ -435,7 +539,7 @@ Only files that had any changes made to them are written. If AUG_SAVE_NEWFILE is set in the FLAGS passed to AUG_INIT, create- changed files as new files with the extension ".augnew", and leave teh+ changed files as new files with the extension ".augnew", and leave the original file unmodified. Otherwise, if AUG_SAVE_BACKUP is set in the FLAGS passed to AUG_INIT,@@ -451,7 +555,50 @@ ret <- c_aug_save aug_ptr return ret +-- --------+-- aug_load+-- --------+foreign import ccall unsafe "augeas.h aug_load"+ c_aug_load :: Ptr Augeas -- aug+ -> IO (CInt) -- return value+{-|+ Function: aug_load+ + Load files into the tree. Which files to load and what lenses to use on+ them is specified under /augeas/load in the tree; each entry+ /augeas/load/NAME specifies a 'transform', by having itself exactly one+ child 'lens' and any number of children labelled 'incl' and 'excl'. The+ value of NAME has no meaning.+ + The 'lens' grandchild of /augeas/load specifies which lens to use, and+ can either be the fully qualified name of a lens 'Module.lens' or+ '@Module'. The latter form means that the lens from the transform marked+ for autoloading in MODULE should be used.+ + The 'incl' and 'excl' grandchildren of /augeas/load indicate which files+ to transform. Their value are used as glob patterns. Any file that+ matches at least one 'incl' pattern and no 'excl' pattern is+ transformed. The order of 'incl' and 'excl' entries is irrelevant.+ + When AUG_INIT is first called, it populates /augeas/load with the+ transforms marked for autoloading in all the modules it finds.+ + Before loading any files, AUG_LOAD will remove everything underneath+ /augeas/files and /files, regardless of whether any entries have been+ modified or not.+ + Returns -1 on error, 0 on success. Note that success includes the case+ where some files could not be loaded. Details of such files can be found+ as '/augeas//error'. +-}+aug_load :: Ptr Augeas -- ^ Augeas pointer+ -> IO (AugRet) -- ^ return value+aug_load aug_ptr = + do + ret <- c_aug_load aug_ptr+ return (AugRet ret)+ -- --------- -- aug_print -- ---------@@ -497,3 +644,76 @@ fclose out return(ret) ++-- ---------+-- aug_error+-- ---------+foreign import ccall unsafe "augeas.h aug_error"+ c_aug_error :: Ptr Augeas -- aug+ -> IO (AugErrCode) -- error code++{-|+ Return a human-readable message for the error code */+-}++aug_error :: Ptr Augeas -- ^ Augeas pointer+ -> IO (AugErrCode) -- ^ return value+aug_error aug_ptr = + do + ret <- c_aug_error aug_ptr+ return(ret)++-- -----------------+-- aug_error_message+-- -----------------+foreign import ccall unsafe "augeas.h aug_error_message"+ c_aug_error_message :: Ptr Augeas -- aug+ -> IO (CString) -- return value+{-|+ Return a human-readable message for the error code */+-}+aug_error_message :: Ptr Augeas -- ^ Augeas pointer+ -> IO (ByteString) -- ^ return value+aug_error_message aug_ptr = + do + cstr <- c_aug_error_message aug_ptr+ ret <- packCString cstr+ return(ret)++-- -----------------------+-- aug_error_minor_message+-- -----------------------+foreign import ccall unsafe "augeas.h aug_error_minor_message"+ c_aug_error_minor_message :: Ptr Augeas -- aug+ -> IO (CString) -- return value+{-|+ Return a human-readable message elaborating the error code; might be+ NULL. For example, when the error code is AUG_EPATHX, this will explain+ how the path expression is invalid */+-}+aug_error_minor_message :: Ptr Augeas -- ^ Augeas pointer+ -> IO (ByteString) -- ^ return value+aug_error_minor_message aug_ptr = + do + cstr <- c_aug_error_minor_message aug_ptr+ ret <- packCString cstr+ return(ret)++-- -----------------+-- aug_error_details+-- -----------------+foreign import ccall unsafe "augeas.h aug_error_details"+ c_aug_error_details :: Ptr Augeas -- aug+ -> IO (CString) -- return value+{-|+ Return details about the error, which might be NULL. For example, for+ AUG_EPATHX, indicates where in the path expression the error+ occurred. The returned value can only be used until the next API call+-}+aug_error_details :: Ptr Augeas -- ^ Augeas pointer+ -> IO (ByteString) -- ^ return value+aug_error_details aug_ptr = + do + cstr <- c_aug_error_details aug_ptr+ ret <- packCString cstr+ return(ret)
System/AugeasHsc.hsc view
@@ -40,6 +40,29 @@ , save_backup = AUG_SAVE_BACKUP , save_newfile = AUG_SAVE_NEWFILE , type_check = AUG_TYPE_CHECK+ , no_stdinc = AUG_NO_STDINC+ , save_noop = AUG_SAVE_NOOP+ , no_load = AUG_NO_LOAD+ , no_modl_autoload = AUG_NO_MODL_AUTOLOAD+}++-- ---------------------------------+-- Maps to auf_errcode_t in augeas.h+-- ---------------------------------++newtype AugErrCode = AugErrCode { unAugErrCode :: CInt }+ deriving (Eq, Show)++#{enum AugErrCode, AugErrCode+ , no_error = AUG_NOERROR+ , err_no_memory = AUG_ENOMEM+ , err_internal = AUG_EINTERNAL+ , err_bad_path = AUG_EPATHX+ , err_no_match = AUG_ENOMATCH+ , err_multi_matches = AUG_EMMATCH+ , err_syntax = AUG_ESYNTAX+ , err_no_lens = AUG_ENOLENS+ , err_multi_xfm = AUG_EMXFM }
augeas.cabal view
@@ -1,5 +1,5 @@ Name: augeas-Version: 0.1.2+Version: 0.2.0 Synopsis: A Haskell FFI wrapper for the Augeas API Description: A Haskell FFI wrapper for the Augeas API Author: Jude Nagurney@@ -7,6 +7,7 @@ Cabal-Version: >= 1.2 License: GPL License-File: LICENSE+Data-Files: AUTHORS Build-Type: Custom Category: System Stability: Alpha@@ -15,7 +16,7 @@ library Exposed-Modules: System.Augeas Other-Modules: System.AugeasHsc- Build-Depends: base >= 2.0, bytestring >= 0.9.0.1, unix >=2.3.0.0, haskell98+ Build-Depends: base >= 2.0 && <4, directory, unix >=2.3.0.0, bytestring >= 0.9.0.1 GHC-options: -Wall -fwarn-dodgy-imports executable "test-haskell-augeas"