How do I collect command line parameters correctly in Hxt program?
I got to section 3 of the thesis. A Haskell XML Dashboard Cookbook with Examples for Processing RDF Documents by M. Ohlendorf.
Here is the program I am writing
import Text.XML.HXT.Core
import System.Exit
import System.Environment
import Data.Maybe
main = do
args <- getArgs
(al, src) <- cmdLineOpts args
[rc] <- runX (processDocument al src)
exitWith ( if rc >= c_err
then ExitFailure (-1)
else ExitSuccess
)
cmdLineOpts :: [String] -> IO (Attributes, String)
cmdLineOpts [] = return ([("","")], "")
cmdLineOpts xss = return (zip [""] xss :: Attributes, last xss)
processDocument :: Attributes -> String -> IOSArrow b Int
processDocument al src =
readDocument al src -- lecture du document en appliquant les attributes
>>>
removeAllWhiteSpace >>> propagateNamespaces
>>>
writeDocument al (fromMaybe "" (lookup a_output_file al))
>>>
getErrStatus
But I still face the following error
hxtuto.hs:28:17:
Couldn't match expected type `XIOSysState -> XIOSysState'
against inferred type `(String, String)'
Expected type: SysConfigList
Inferred type: Attributes
In the first argument of `readDocument', namely `al'
In the first argument of `(>>>)', namely `readDocument al src'
Failed, modules loaded: none.
It seems like this is my implementation cmdLineOpts
that doesn't fit well.
What is the problem? and how to fix it?
Thanks for any help!
source to share
Since the first parameter for readDocument and writeDocument is [SysConfig], you can use a package such as GetOpt to process the command line read home text and convert it to the required objects. I took the list of "available options" from the abstract page 50 and created a type "Parameters" with the current corresponding SysConfigs (from Text.XML.HXT.Arrow.XmlState.SystemConfig). Except for the parts that were customized for a particular application at hand, the rest (like cmdLineOpts) were taken directly from the GetOpt documentation.
import System.Console.GetOpt
import System.Environment
import System.Exit
import Text.XML.HXT.Core
data Options = Options {
withvalidate :: SysConfig
, withchecknamespaces :: SysConfig
, withcanonicalize :: SysConfig
, withremovews :: SysConfig
, withtrace :: SysConfig
, output_file :: String }
defaultOptions = Options { withvalidate = (withValidate no)
, withchecknamespaces = (withCheckNamespaces no)
, withcanonicalize = (withCanonicalize no)
, withremovews = (withRemoveWS no)
, withtrace = (withTrace 0)
, output_file = "" }
options :: [OptDescr (Options -> Options)]
options =
[ Option ['V'] ["withValidate"]
(ReqArg (\v opts -> opts { withvalidate = withValidate (v == "yes") } ) "")
"perform DTD validation"
, Option ['n'] ["withCheckNamespaces"]
(ReqArg (\n opts -> opts { withchecknamespaces = withCheckNamespaces (n == "yes") } ) "")
"check namespaces"
, Option ['c'] ["withCanonicalize"]
(ReqArg (\c opts -> opts { withcanonicalize = withCanonicalize (c == "yes") } ) "")
"canonicalize document"
, Option ['w'] ["withRemoveWS"]
(ReqArg (\w opts -> opts { withremovews = withRemoveWS (w == "yes") } ) "")
"remove whitespace used for document indentation"
, Option ['t'] ["withTrace"]
(ReqArg (\t opts -> opts { withtrace = withTrace (read t) } ) "")
"set trace level"
, Option ['o'] ["outputFile"]
(ReqArg (\o opts -> opts { output_file = o } ) "")
"output file" ]
cmdLineOpts :: [String] -> IO (Options, [String])
cmdLineOpts argv =
case getOpt Permute options argv of
(o, n, []) -> return (foldl (flip id) defaultOptions o, n)
(_, _, errs) -> ioError (userError (concat errs ++ usageInfo header options))
where header = "Using: [OPTION ...]"
main :: IO ()
main = do (opts, (src:_)) <- cmdLineOpts =<< getArgs
[rc] <- runX $ processDocument opts src
exitWith $ if rc >= c_err then ExitFailure (-1) else ExitSuccess
processDocument :: Options -> String -> IOSArrow b Int
processDocument (Options val ns can ws tr out) src =
readDocument [val, ns, can, ws, tr] src >>>
removeAllWhiteSpace >>> propagateNamespaces >>>
writeDocument [val, ns, can, ws, tr] out >>>
getErrStatus
source to share