packages feed

ip6addr-0.3.2: src/IP6AddrCan.hs

import System.IO
import System.Exit
import System.Environment
import System.Console.GetOpt

-- local import
import IPv6Addr
import CidrSuffix

data Flag = Help | Version | Stderr deriving (Show,Eq)

options :: [OptDescr Flag]
options =
          [Option "v" [] (NoArg Version) "Show version number"
          ,Option "e" [] (NoArg Stderr)  "Throw out discarded inputs to stderr"
          ,Option "h" [] (NoArg Help)    "Show usage"]

parseArgs args = case getOpt RequireOrder options args of
                 ([],[],[])           -> evalInputs . lines =<< getContents
                 ([Version],[],[])    -> putStrLn version >> exit
                 ([Help],[],[])       -> putStrLn (usageInfo help options) >> exit
                 ([Stderr],[],[])     -> evalInputsErr . lines =<< getContents
                 ([Stderr],inputs,[]) -> evalInputsErr inputs
                 ([],inputs,[])       -> evalInputs inputs
                 (_,_,errs)           -> hPutStr stderr (concat errs ++ usageInfo help options)
                                             >> exitWith (ExitFailure 1)

evalInputs :: [String] -> IO ()
evalInputs [] = exit
evalInputs (i:is) =
    case maybeIPv6Addr a of
        Just b -> putStrLn b >> evalInputs is
        Nothing -> evalInputs is
    where a = removeCidrSuffix i

evalInputsErr :: [String] -> IO ()
evalInputsErr [] = exit
evalInputsErr (i:is) =
    case maybeIPv6Addr a of
        Just b -> putStrLn b >> evalInputsErr is
        Nothing -> hPutStrLn stderr i >> evalInputsErr is
    where a = removeCidrSuffix i
			   
version = "ip6addrcan version 0.3.2"

help   = "Usage: ip6addrcan [-v|-h] | [-e] [address ...]\n"

exit   = exitWith ExitSuccess

main :: IO ()
main = getArgs >>= parseArgs