1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
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 }) "<config_file>")
"The config file to use"
, Option "g" ["group"]
(ReqArg (\arg opt -> return opt { optGroup = return arg }) "<group>")
"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 }) "<user>")
"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]"
|