    -- ------------------------------------------------------------

    {- |
       Module     : Text.XML.HXT.RelaxNG
       Copyright  : Copyright (C) 2010 Uwe Schmidt, Torben Kuseler
       License    : MIT

       Maintainer : Uwe Schmidt (uwe@fh-wedel.de)
       Stability  : stable
       Portability: portable

       This helper module exports elements from the basic Relax NG libraries:
       Validator, CreatePattern, PatternToString and DataTypes.
       It is the main entry point to the Relax NG schema validator of the Haskell
       XML Toolbox.

    -}

    -- ------------------------------------------------------------

    module   Text.XML.HXT.RelaxNG.SystemConfig
    where

    import           Text.XML.HXT.Arrow.XmlOptions
    import           Text.XML.HXT.Arrow.XmlState.TypeDefs

    import           Text.XML.HXT.RelaxNG.Validator       (validateDocumentWithRelaxSchema)

    import           System.Console.GetOpt

    -- ------------------------------------------------------------

    withRelaxNG                     :: String -> SysConfig
    withRelaxNG s                   = setS (theRelaxValidate
                                            .&&&. theRelaxSchema
                                            .&&&. theRelaxValidator
                                           ) ( not (null s)         -- null s turns off validation
                                             , ( s
                                               , validateDocumentWithRelaxSchema [] s
                                               )
                                             )

    withRelaxCheckRestr             ::  Bool -> SysConfig
    withRelaxCheckRestr             = setS theRelaxCheckRestr

    withRelaxValidateExtRef         :: Bool -> SysConfig
    withRelaxValidateExtRef         = setS theRelaxValidateExtRef

    withRelaxValidateInclude        :: Bool -> SysConfig
    withRelaxValidateInclude        = setS theRelaxValidateInclude

    withRelaxCollectErrors          :: Bool -> SysConfig
    withRelaxCollectErrors          = setS theRelaxCollectErrors

    -- ------------------------------------------------------------

    -- | available Relax NG validation options
    --
    -- defines options
    -- 'a_check_restrictions', 'a_validate_externalRef', 'a_validate_include', 'a_do_not_check_restrictions',
    -- 'a_do_not_validate_externalRef', 'a_do_not_validate_include'

    relaxOptions :: [OptDescr SysConfig]
    relaxOptions
        = [ Option "X" [a_relax_schema]                     (ReqArg withRelaxNG             "SCHEMA")  "validation with Relax NG, SCHEMA is the URI for the Relax NG schema"
          , Option ""  [a_check_restrictions]               (NoArg (withRelaxCheckRestr        True))  "check Relax NG schema restrictions during schema simplification (default)"
          , Option ""  [a_do_not_check_restrictions]        (NoArg (withRelaxCheckRestr       False))  "do not check Relax NG schema restrictions"
          , Option ""  [a_validate_externalRef]             (NoArg (withRelaxValidateExtRef    True))  "validate a Relax NG schema referenced by a externalRef-Pattern (default)"
          , Option ""  [a_do_not_validate_externalRef]      (NoArg (withRelaxValidateExtRef   False))  "do not validate a Relax NG schema referenced by an externalRef-Pattern"
          , Option ""  [a_validate_include]                 (NoArg (withRelaxValidateInclude   True))  "validate a Relax NG schema referenced by an include-Pattern (default)"
          , Option ""  [a_do_not_validate_include]          (NoArg (withRelaxValidateInclude  False))   "do not validate a Relax NG schema referenced by an include-Pattern"
          , Option ""  [a_collect_errors]                   (NoArg (withRelaxCollectErrors     True))   "collect errors, default"
          , Option ""  [a_do_not_collect_errors]            (NoArg (withRelaxCollectErrors    False))   "do not collect errors"
          ]

    -- ------------------------------------------------------------
    -- option for Relax NG

    a_relax_schema,
     a_do_not_check_restrictions,
     a_check_restrictions,
     a_do_not_validate_externalRef,
     a_validate_externalRef,
     a_do_not_validate_include,
     a_validate_include,
     a_do_not_collect_errors :: String

    a_relax_schema                = "relax-schema"
    a_do_not_check_restrictions   = "do-not-check-restrictions"
    a_check_restrictions          = "check-restrictions"
    a_do_not_validate_externalRef = "do-not-validate-externalRef"
    a_validate_externalRef        = "validate-externalRef"
    a_do_not_validate_include     = "do-not-validate-include"
    a_validate_include            = "validate-include"
    a_do_not_collect_errors       = "do-not-collect-errors"

    -- ------------------------------------------------------------