1 {-# LANGUAGE NamedFieldPuns #-}
2 {-# LANGUAGE OverloadedStrings #-}
3 {-# LANGUAGE TupleSections #-}
4 module Hcompta.CLI.Command where
6 import Data.Maybe (fromMaybe)
7 import qualified Data.Text.Lazy as TL
8 import System.Console.GetOpt
12 import System.Environment (getProgName)
13 import System.Exit (exitWith, ExitCode(..))
14 import qualified System.IO as IO
16 import qualified Hcompta.CLI.Args as Args
17 import qualified Hcompta.CLI.Command.Balance as Command.Balance
18 import qualified Hcompta.CLI.Command.GL as Command.GL
19 import qualified Hcompta.CLI.Command.Print as Command.Print
20 import Hcompta.CLI.Context (Context)
21 import qualified Hcompta.CLI.Context as Context
22 import qualified Hcompta.CLI.Lang as Lang
23 import qualified Hcompta.CLI.Write as Write
24 import Hcompta.Lib.Leijen ((<>))
25 import qualified Hcompta.Lib.Leijen as W
32 , " "++bin++" [option..] <command> [arguments]"
34 , usageInfo "OPTIONS" options
35 , "COMMANDS (use "++bin++" <command> --help for specific help)"
36 , " balance [-i FILE]"
40 options :: Args.Options Context
43 (NoArg (\_opts _context -> do
44 usage >>= IO.hPutStr IO.stderr
45 exitWith ExitSuccess))
47 , Option "v" ["verbosity"]
48 (OptArg (\arg _context context ->
51 case Context.verbosity context of
53 return $ context{Context.verbosity=succ v}
55 Just "error" -> return $ context{Context.verbosity=Context.Verbosity_Error}
56 Just "warn" -> return $ context{Context.verbosity=Context.Verbosity_Warn}
57 Just "info" -> return $ context{Context.verbosity=Context.Verbosity_Info}
58 Just "debug" -> return $ context{Context.verbosity=Context.Verbosity_Debug}
59 Just _ -> Write.fatal context $
60 W.text "--verbosity option expects \"error\", \"warn\", \"info\", or \"debug\" as value")
61 "error|warn|info|debug"
63 "increment or set verbosity level, can be use multiple times"
65 (OptArg (\arg _context context -> do
67 Nothing -> return $ Just True
68 Just "always" -> return $ Just True
69 Just "never" -> return $ Just False
70 Just "auto" -> return $ Nothing
71 Just _ -> Write.fatal context $
72 W.text "--color option expects \"always\", \"auto\", or \"never\" as value"
73 return $ context{Context.color})
74 "[always|auto|never]")
77 (ReqArg (\lang _context context -> do
78 return $ context{Context.lang =
79 fromMaybe (Context.lang context) $
80 Lang.lang_of_strings [lang]
83 "RFC1766 / ISO 639-1 language code (eg, fr, en-GB, etc.)"
86 run :: Context -> String -> [String] -> IO ()
87 run context cmd args =
89 "print" -> Command.Print.run context args
90 "balance" -> Command.Balance.run context args
91 "gl" -> Command.GL.run context args
92 _ -> usage >>= Write.fatal context .
93 ((W.text "unknown command: " <> (W.text $ TL.pack cmd) <> W.line) <>) .