content: -- |
  -- HRelaxNG - Relax NG Validator of the Haskell XML Toolbox.
  -- RELAX NG is a simpler schema language for XML.
  --
  -- Author : Torben Kuseler
  --
  -- This program may be used as example main program for the
  -- Relax NG Validator.
  --
  
  module Main
  where
  
  import System.IO
  import System.Environment
  import System.Console.GetOpt
  import System.Exit
  
  import Text.XML.HXT.Core
  import Text.XML.HXT.RelaxNG
  
  -- ------------------------------------------------------------
  
  
  main :: IO ()
  main
    = do
      argv <- getArgs                       -- get the commandline arguments
      (al, xml, schema) <- cmdlineOpts argv -- and evaluate them, return a key-value list
      [rc]  <- runX (relax al xml schema)   -- run the Relax NG validator 
      exitProg (rc >= c_err)                -- set return code and terminate
  
  relax :: SysConfigList -> String -> String -> IOSArrow b Int
  relax al xml schema
      = configSysVars al
        >>>
        readDocument [withRelaxNG schema] xml
        >>>
        writeDocument [] "-"
        >>>
        getErrStatus
  
  
  exitProg        :: Bool -> IO a
  exitProg True   = exitWith (ExitFailure 1)
  exitProg False  = exitWith ExitSuccess
  
  
  
  -- ------------------------------------------------------------
  --
  -- the options definition part
  -- see doc for System.Console.GetOpt
  
  progName    :: String
  progName    = "HRelaxNGValidator"
  
  options     :: [OptDescr SysConfig]
  options
      = generalOptions
        ++
        inputOptions
        ++
        relaxOptions
        ++
        outputOptions
  
  usage :: [String] -> IO a
  usage errl
      | null errl
          = do
            hPutStrLn stdout use
            exitProg False
      | otherwise
          = do
            hPutStrLn stderr (concat errl ++ "\n" ++ use)
            exitProg True
      where
      header = "HRelaxNGValidator - Relax NG schema validator of the " ++
               "Haskell XML Toolbox with Arrow Interface\n\n" ++
               "Usage: " ++ progName ++ " [OPTION...] (XML file URI/FILE) (Relax NG Schema URI/FILE)"
      use    = usageInfo header options
  
  cmdlineOpts :: [String] -> IO (SysConfigList, String, String)
  cmdlineOpts argv
      = case (getOpt Permute options argv) of
        (ol,n,[])
          -> do
             (xml, schema) <- src n
             help (getConfigAttr a_help ol)
             return (ol, xml, schema)
        (_,_,errs)
          -> usage errs
      where
      src [xml, schema] = return (xml, schema)
      src []  = usage ["XML file and Relax NG schema input file/url missing"]
      src [_] = usage ["Relax NG schema input file/url missing"]
      src _   = usage ["too many arguments"]
  
      help "1" = usage []
      help _   = return ()
  
  
  -- ------------------------------------------------------------
  