module Main where import Options.Applicative as Opt import Control.Exception.Safe import System.Exit import Data.Semigroup import IPTypes import ParseIP import LookupIP data Params = Params FilePath String mkParams :: Opt.Parser Params mkParams = Params <$> argument str (metavar "FILE" <> help "IP range database") <*> argument str (metavar "IP" <> help "IP address to check") run :: Params -> IO () run (Params fp ipstr) = do iprs <- parseIPRanges <$> readFile fp case (iprs, parseIP ipstr) of (_, Nothing) -> throw (InvalidIP ipstr) (Left pe, _) -> throw (LoadIPRangesError pe) (Right iprdb, Just ip) -> putStrLn $ reportIPs iprdb [ip] main = (execParser opts >>= run) `catches` [Handler parserExit] where opts = info (mkParams <**> helper) (fullDesc <> progDesc ("Answers YES/NO depending on whether " ++ "an IP address belongs to the IP range database")) parserExit :: ExitCode -> IO () parserExit _ = pure ()