module Main (main) where import Control.Monad (when) import Prelude hiding (catch) import System.Console.GetOpt import System.Environment import System.Exit import System.IO -- | Main function main :: IO () main = do args <- getArgs -- Parse options, getting a list of option actions let (actions, nonOptions, errors) = getOpt RequireOrder options args -- Here we thread startOptions through all supplied option actions opts <- case (nonOptions, errors) of ([], []) -> foldl (>>=) (return defaultOptions) actions (_, _) -> do hPutStrLn stderr $ concat errors ++ usageInfo header options exitWith $ ExitFailure 1 when (optDebug opts) . putStrLn $ "Got options : " ++ (show opts) -- | CLI options data Options = Options { optDebug :: Bool , optConfigFile :: Maybe String , optGroup :: Maybe String , optUser :: Maybe String , optVerbose :: Bool } deriving (Show) -- | CLI default options defaultOptions :: Options defaultOptions = Options { optDebug = False , optConfigFile = Nothing , optGroup = Nothing , optUser = Nothing , optVerbose = False } -- | CLI options logic options :: [ OptDescr (Options -> IO Options) ] options = [ Option "d" ["debug"] (NoArg (\opt -> return opt { optDebug = True, optVerbose = True })) "Enter verbose debug mode and prevents Hsbot from forking in background" , Option "f" ["file"] (ReqArg (\arg opt -> return opt { optConfigFile = return arg }) "") "The config file to use" , Option "g" ["group"] (ReqArg (\arg opt -> return opt { optGroup = return arg }) "") "The group hsbot will run as" , Option "h" ["help"] (NoArg (\_ -> do putStrLn $ usageInfo header options exitWith ExitSuccess)) "Print this help message" , Option "u" ["user"] (ReqArg (\arg opt -> return opt { optUser = return arg }) "") "The user hsbot will run as" , Option "v" ["verbose"] (NoArg (\opt -> return opt { optVerbose = True })) "Enable verbose messages" , Option "V" ["version"] (NoArg (\_ -> do putStrLn "Hsbot version 0.3" exitWith ExitSuccess)) "Show version" ] -- | Usage header header :: String header = "Usage: hsbot [-dhvV] [-f config_file] [-u user] [-g group]"