-- -- Copyright (c) 2005 Don Stewart - http://www.cse.unsw.edu.au/~dons -- Sean Seefried -- Stefan Wehr -- GPL version 2 or later (see http://www.gnu.org/copyleft/gpl.html) -- module CmdlineArgs where import Logging import System import System.Console.GetOpt import System.Environment ( getArgs, getProgName ) data Flag = LogLevel LogLevel | Strategy String | Help deriving Eq getLogLevel :: [Flag] -> LogLevel getLogLevel [] = Warn getLogLevel (LogLevel l:_) = l getLogLevel (_:rest) = getLogLevel rest getStrategy :: [Flag] -> Maybe String getStrategy [] = Nothing getStrategy (Strategy s:_) = Just s getStrategy (_:rest) = getStrategy rest -- -- associate concrete flags with their abstract representation -- opts :: [OptDescr Flag] opts = [ Option ['?', 'h'] ["help"] (NoArg Help) "this message" , Option ['l'] [] (ReqArg parseLevel "(debug|info|warn)") "set the log level" , Option ['s'] [] (ReqArg Strategy "STRATEGY") "set strategy" ] parseLevel :: String -> Flag parseLevel s = case levelFromString s of Nothing -> niceError ("unknown debug level: " ++ s) Just l -> LogLevel l parseArgs :: IO ([Flag],[String]) parseArgs = do prog <- getProgName argv <- getArgs case (getOpt Permute opts argv) of (flags,fs,[]) -> case () of _| Help `elem` flags -> do putStrLn $ usage prog exitWith ExitSuccess | otherwise -> return (flags,fs) (_,_,err) -> niceError $ concat err ++ (usage prog) where usage prog = usageInfo ("Usage: "++ prog ++" [OPTION...] file") opts