{-# LANGUAGE TupleSections #-} module Hcompta.CLI.Args where import Control.Monad (Monad(..), liftM) import Data.List (map, foldl') import Data.String (String) import qualified Data.Text.Lazy as TL import Prelude (($), (.), IO) import System.Console.GetOpt ( getOpt , ArgOrder(..) , OptDescr(..) ) import Hcompta.CLI.Context (Context) import qualified Hcompta.CLI.Write as Write import Hcompta.Lib.Leijen ((<>)) import qualified Hcompta.Lib.Leijen as W 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, []) -> do liftM (, cmds) $ Data.List.foldl' (>>=) (return ctx) parsers (_, _, errs) -> do usage c >>= Write.fatal c . (W.vsep (map (W.text . TL.pack) errs) <>) . W.text . TL.pack