{-# LANGUAGE TupleSections #-} module Hcompta.CLI.Args where import Control.Monad (Monad(..)) import Data.Function ((.)) import qualified Data.List as List import Data.Monoid ((<>)) import Data.Functor ((<$>)) import Data.String (String) import qualified Data.Text.Lazy as TL import System.Console.GetOpt ( getOpt , ArgOrder(..) , OptDescr(..) ) import System.IO (IO) import qualified Text.WalderLeijen.ANSI.Text as W import Hcompta.CLI.Context (Context) import qualified Hcompta.CLI.Write as Write type Options context = [OptDescr (context -> IO context)] parse :: Context -> (Context -> IO String) -> (Context -> Options c) -> (c, [String]) -> IO (c, [String]) parse c usage options (ctx, args) = case getOpt RequireOrder (options c) args of (parsers, cmds, []) -> (, cmds) <$> List.foldl' (>>=) (return ctx) parsers (_, _, errs) -> usage c >>= Write.fatal c . (W.vsep (W.text . TL.pack <$> errs) <>) . W.text . TL.pack