{-# LANGUAGE DeriveDataTypeable #-} module CommandLine ( Args(..), get_args ) where import System.Console.CmdArgs ( Data, Typeable, (&=), args, auto, cmdArgs, def, details, explicit, groupname, help, helpArg, modes, name, program, summary, typ, versionArg ) -- Get the version from Cabal. import Paths_haeredes (version) import Data.Version (showVersion) -- | Description of the 'NS' mode. ns_description :: String ns_description = "Confirm delegation of NS records. " ++ "This is the default mode." -- | Description of the 'MX' mode. mx_description :: String mx_description = "Confirm delegation of MX records." program_name :: String program_name = "haeredes" my_summary :: String my_summary = program_name ++ "-" ++ (showVersion version) no_append_root_help :: String no_append_root_help = "Don't append a trailing dot to DNS names" -- | Help string for the --server flag. server_help :: String server_help = "IP address or hostname of server to query " ++ "(will use resolv.conf if not specified)" -- | The Args type represents the possible command-line options. The -- duplication here seems necessary; CmdArgs' magic requires us to -- define some things explicitly. data Args = NS { no_append_root :: Bool, server :: Maybe String, delegates :: [String] } | MX { no_append_root :: Bool, server :: Maybe String, delegates :: [String] } deriving (Data, Show, Typeable) arg_spec :: Args arg_spec = modes [ns &= auto, mx] &= program program_name &= summary my_summary &= helpArg [explicit, name "help", name "h", groupname "Common flags"] &= versionArg [explicit, name "version", name "v", groupname "Common flags"] where -- The repetition here is necessary, some CmdArgs magic going on. ns :: Args ns = NS { no_append_root = def &= groupname "Common flags" &= help no_append_root_help, server = def &= groupname "Common flags" &= typ "HOST" &= help server_help, delegates = def &= args &= typ "DELEGATES" } &= details [ns_description] mx :: Args mx = MX { no_append_root = def &= groupname "Common flags" &= help no_append_root_help, server = def &= groupname "Common flags" &= typ "IP" &= help server_help, delegates = def &= args &= typ "DELEGATES" } &= details [mx_description] get_args :: IO Args get_args = cmdArgs arg_spec