{-# LANGUAGE NamedFieldPuns #-} {-# LANGUAGE TupleSections #-} module Hcompta.CLI.Command where import System.Console.GetOpt ( ArgDescr(..) , OptDescr(..) , usageInfo ) import System.Environment (getProgName) import System.Exit (exitWith, ExitCode(..)) import qualified System.IO as IO import Hcompta.CLI.Context (Context) import qualified Hcompta.CLI.Args as Args import qualified Hcompta.CLI.Command.Balance as Command.Balance import qualified Hcompta.CLI.Command.Print as Command.Print import qualified Hcompta.CLI.Context as Context import qualified Hcompta.CLI.Write as Write usage :: IO String usage = do bin <- getProgName return $ unlines $ [ "SYNTAX " , " "++bin++" [option..] [arguments]" , "" , usageInfo "OPTIONS" options , "COMMANDS" , " balance" , " print" ] options :: Args.Options Context options = [ Option "h" ["help"] (NoArg (\_opts -> do usage >>= IO.hPutStr IO.stderr exitWith ExitSuccess)) "show this help" , Option "v" ["verbose"] (NoArg (\context -> return $ context{Context.verb=True})) "show intermediate results" , Option "" ["color"] (OptArg (\arg context -> do color <- case arg of Nothing -> return $ Just True Just "always" -> return $ Just True Just "never" -> return $ Just False Just "auto" -> return $ Nothing Just _ -> Write.fatal context "--color option expects \"always\", \"auto\", or \"never\" as value" return $ context{Context.color}) "[always|auto|never]") "colorize output" ] run :: Context -> String -> [String] -> IO () run context cmd args = case cmd of "print" -> Command.Print.run context args "balance" -> Command.Balance.run context args _ -> usage >>= Write.fatal context . (("unknown command: " ++ cmd ++ "\n") ++)