bump 0.1.2.5
[htalkat.git] / Opts.hs
bloba4b550eef134be831b5527990b0dec3d2aba086c
1 -- This file is part of htalkat
2 -- Copyright (C) 2021 Martin Bays <mbays@sdf.org>
3 --
4 -- This program is free software: you can redistribute it and/or modify
5 -- it under the terms of version 3 of the GNU General Public License as
6 -- published by the Free Software Foundation, or any later version.
7 --
8 -- You should have received a copy of the GNU General Public License
9 -- along with this program. If not, see http://www.gnu.org/licenses/.
11 {-# LANGUAGE Safe #-}
13 module Opts (globalHelp, localHelp, parseGlobal, parseLocal, Opt(..)) where
15 import System.Console.GetOpt
17 import qualified Command as C
19 data Opt
20 -- global:
21 = DataDir FilePath
22 | SocksHost String
23 | SocksPort String
24 | Help
25 | Version
26 -- local:
27 | Port String
28 | Host String
29 | BlockUnnamed
30 | AcceptUnnamed
31 | ListPending
32 | SpawnInteractive FilePath
33 | DumbClient
34 | CursesClient
35 | LocalTop
36 | LocalBottom
37 | Log
38 | NoLog
39 deriving (Eq, Ord, Show)
41 globalOptions :: [OptDescr Opt]
42 globalOptions =
43 [ Option ['d'] ["datadir"] (ReqArg DataDir "PATH") "default: ~/.htalkat, or $HTALKAT_DIR if set"
44 , Option ['S'] ["socks-host"] (ReqArg SocksHost "HOST") "use SOCKS5 proxy"
45 , Option ['P'] ["socks-port"] (ReqArg SocksPort "PORT") "port for SOCKS5 proxy (default: 1080)"
46 , Option ['v'] ["version"] (NoArg Version) "show version information"
47 , Option ['h'] ["help"] (NoArg Help) "show usage information"
50 localOptions :: C.Command -> [OptDescr Opt]
51 localOptions com =
52 Option ['h'] ["help"] (NoArg Help) "show usage information" :
53 case com of
54 C.Listen ->
55 [ Option ['p'] ["port"] (ReqArg Port "PORT") "Port to listen on (default: 5518)"
56 , Option ['H'] ["host"] (ReqArg Host "HOST") "Host to listen on (empty means bind all available)"
57 , Option ['b'] ["block-unnamed"] (NoArg BlockUnnamed) "Reject connections from unnamed users"
58 , Option ['a'] ["accept-unnamed"] (NoArg AcceptUnnamed) "Accept connections from unnamed users (default)"
60 C.Answer ->
61 [ Option ['l'] ["list"] (NoArg ListPending) "List unanswered incoming connections"
62 , Option ['i'] ["interactive-client"] (ReqArg SpawnInteractive "SOCKET_PATH") "Directly invoke interactive client"
63 ] <> interactiveClientOptions
64 C.Connect -> interactiveClientOptions
65 _ -> []
66 where interactiveClientOptions =
67 [ Option ['d'] ["dumb"] (NoArg DumbClient) "Use dumb line-based client"
68 , Option ['c'] ["curses"] (NoArg CursesClient) "Use curses client (default)"
69 , Option ['t'] ["top"] (NoArg LocalTop) "Put you on top in curses client"
70 , Option ['b'] ["bottom"] (NoArg LocalBottom) "Put you on bottom in curses client (default)"
71 , Option ['L'] ["log"] (NoArg Log) "Log conversation"
72 , Option ['N'] ["no-log"] (NoArg NoLog) "Don't log conversation (default)"
75 globalHelp :: String -> String
76 globalHelp = (`usageInfo` globalOptions)
78 localHelp :: C.Command -> String -> String
79 localHelp c = (`usageInfo` localOptions c)
81 parseArgs :: [OptDescr Opt] -> [String] -> IO ([Opt],[String])
82 parseArgs opts argv =
83 case getOpt RequireOrder opts argv of
84 (o,n,[]) -> return (o,n)
85 (_,_,errs) -> ioError . userError $ concat errs
87 parseGlobal :: [String] -> IO ([Opt],[String])
88 parseGlobal = parseArgs globalOptions
90 parseLocal :: C.Command -> [String] -> IO ([Opt],[String])
91 parseLocal = parseArgs . localOptions