]> gitweb.michael.orlitzky.com - email-validator.git/blobdiff - src/CommandLine.hs
Add command-line processing.
[email-validator.git] / src / CommandLine.hs
diff --git a/src/CommandLine.hs b/src/CommandLine.hs
new file mode 100644 (file)
index 0000000..1088f2a
--- /dev/null
@@ -0,0 +1,72 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+
+module CommandLine
+where
+
+import System.Console.CmdArgs
+import System.Console.CmdArgs.Explicit (process)
+import System.Environment (getArgs, withArgs)
+import System.Exit (ExitCode(..), exitWith)
+import System.IO (hPutStrLn, stderr)
+
+-- Get the version from Cabal.
+import Paths_email_validator (version)
+import Data.Version (showVersion)
+
+import ExitCodes
+
+-- We optionally accept input/output files to use instead of
+-- stdin/stdout.
+data Args = Args { input_file :: Maybe FilePath,
+                   output_file :: Maybe FilePath }
+  deriving   (Show, Data, Typeable)
+
+description :: String
+description = "Perform naive validation of email addresses."
+
+program_name :: String
+program_name = "email-validator"
+
+my_summary :: String
+my_summary = program_name ++ "-" ++ (showVersion version)
+
+input_file_help :: String
+input_file_help =
+  "Path to the input file (default: stdin), one email address per line"
+
+output_file_help :: String
+output_file_help =
+  "Path to the output file (default: stdout)"
+
+arg_spec :: Mode (CmdArgs Args)
+arg_spec =
+  cmdArgsMode $
+    Args { input_file  = def &= typFile &= help input_file_help,
+           output_file = def &= typFile &= help output_file_help }
+      &= program program_name
+      &= summary my_summary
+      &= details [description]
+
+show_help :: IO (CmdArgs Args)
+show_help = withArgs ["--help"] parse_args
+
+
+
+parse_args :: IO (CmdArgs Args)
+parse_args = do
+  x <- getArgs
+  let y = process arg_spec x
+  case y of
+    Right result -> return result
+    Left err -> do
+      hPutStrLn stderr err
+      exitWith (ExitFailure exit_args_parse_failed)
+
+
+-- | Really get the command-line arguments. This calls 'parse_args'
+--   first to replace the default "wrong number of arguments" error,
+--   and then runs 'cmdArgsApply' on the result to do what the
+--   'cmdArgs' function usually does.
+apply_args :: IO Args
+apply_args =
+  parse_args >>= cmdArgsApply