import System.Exit (ExitCode(..), exitWith)
import System.IO (stderr, hPutStrLn)
-import Text.Regex.Posix
-
import Cidr (Cidr,
from_string,
+ is_valid_cidr,
min_first_octet,
min_second_octet,
min_third_octet,
import CommandLine (help_set,
help_text,
input_function,
- parse_errors)
+ Mode(..),
+ parse_errors,
+ parse_mode)
-- Some exit codes, used in the ExitFailure constructor.
exit_invalid_cidr :: Int
max4 = max_fourth_octet cidr
--- Will return True if the passed String is in CIDR notation, False
--- otherwise.
-is_valid_cidr :: String -> Bool
-is_valid_cidr cidr = cidr =~ "([0-9]{1,3}\\.){3}[0-9]{1,3}/[0-9]{1,2}"
-
-- Take a list of Strings, and return a regular expression matching
-- any of them.
-- Take a CIDR String, and exit with a failure if it's invalid.
validate_or_die :: String -> IO ()
validate_or_die cidr = do
- if (is_valid_cidr cidr)
+ if (Cidr.is_valid_cidr cidr)
then do
return ()
else do
-- The input function we receive here should know what to read.
inputfunc <- (CommandLine.input_function)
input <- inputfunc
+
let cidr_strings = lines input
mapM validate_or_die cidr_strings
let cidrs = map Cidr.from_string cidr_strings
- let regexes = map cidr_to_regex cidrs
- putStrLn $ alternate regexes
+
+ -- Get the mode of operation.
+ mode <- CommandLine.parse_mode
+
+ case mode of
+ Regex -> do
+ let regexes = map cidr_to_regex cidrs
+ putStrLn $ alternate regexes
+ Reduce -> do
+ putStr input