X-Git-Url: https://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=src%2FCommandLine.hs;h=68957b1c4d2e4cf9fb19d10762fdfc870348417c;hb=79e77832f17cca783e03498b581f8acb59c9d035;hp=eba70dbbe87fcbe8fb2b86e0bdaea3ce66663cc1;hpb=60c61e5eb68575f723beac12fc3162ab30557953;p=hath.git diff --git a/src/CommandLine.hs b/src/CommandLine.hs index eba70db..68957b1 100644 --- a/src/CommandLine.hs +++ b/src/CommandLine.hs @@ -6,17 +6,34 @@ module CommandLine ( help_set, help_text, input_function, - parse_errors + Mode(..), + parse_errors, + parse_mode ) where +import Data.Char(toLower) import System.Console.GetOpt import System.Environment (getArgs) +-- Dark magic. +lowercase :: String -> String +lowercase = map toLower + + +-- The application currently has four modes. The default, Regex, will +-- compute a regular expression matching the input CIDRs. Reduce, on +-- the other hand, will combine any redundant/adjacent CIDR blocks +-- into one. Dupe will show you what would be removed by Reduce, and +-- Diff will show both additions and deletions in a diff-like format. +data Mode = Regex | Reduce | Dupe | Diff + + -- A record containing values for all available options. data Options = Options { opt_help :: Bool, opt_input :: IO String } + -- This constructs an instance of Options, with each of its members -- set to default values. default_options :: Options @@ -43,6 +60,7 @@ set_help :: Options -> IO Options set_help opts = do return opts { opt_help = True } + -- If the input file option is set, this function will update the -- passed Options record with a new function for opt_input. The -- default opt_input is to read from stdin, but if this option is set, @@ -51,9 +69,10 @@ set_input :: String -> Options -> IO Options set_input arg opts = do return opts { opt_input = readFile arg } + -- The usage header usage :: String -usage = "Usage: hath [-h] [-i FILE]" +usage = "Usage: hath [regexed|reduced|duped|diffed] [-h] [-i FILE]" -- The usage header, and all available flags (as generated by GetOpt) @@ -61,11 +80,11 @@ help_text :: String help_text = usageInfo usage options --- Return a tuple of options and errors. -parse_options :: IO (Options, [String]) +-- Return a list of options. +parse_options :: IO Options parse_options = do argv <- getArgs - let (actions, _, errors) = getOpt Permute options argv + let (actions, _, _) = getOpt Permute options argv -- This will execute each of the functions contained in our options -- list, one after another, on a default_options record. The end @@ -73,20 +92,47 @@ parse_options = do -- correctly. opts <- foldl (>>=) (return default_options) actions - return (opts, errors) + return opts --- Return just the errors from parse_options. +-- Return the mode if one was given. +parse_mode :: IO Mode +parse_mode = do + argv <- getArgs + let (_, non_options, _) = getOpt Permute options argv + if (null non_options) + then do + -- Default + return Regex + else do + -- Some non-option was given, but were any of them modes? + case (lowercase (non_options !! 0)) of + "regex" -> return Regex + "regexed" -> return Regex + "reduce" -> return Reduce + "reduced" -> return Reduce + "dupe" -> return Dupe + "duped" -> return Dupe + "diff" -> return Diff + "diffed" -> return Diff + _ -> return Regex + + + + +-- Return a list of errors. parse_errors :: IO [String] parse_errors = do - (_, errors) <- parse_options - return errors + argv <- getArgs + let (_, _, errors) = getOpt Permute options argv + return errors + -- Is the help option set? help_set :: IO Bool help_set = do - (opts, _) <- parse_options + opts <- parse_options return (opt_help opts) @@ -94,5 +140,5 @@ help_set = do -- the input file option was set. input_function :: IO (IO String) input_function = do - (opts, _) <- parse_options + opts <- parse_options return (opt_input opts)