{-# LANGUAGE TupleSections #-} module Hcompta.CLI.Args where import Control.Monad (liftM) import qualified Data.List import qualified Data.Text.Lazy as TL 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 -> context -> IO context)] parse :: Context -> (IO String) -> Options context -> (context, [String]) -> IO (context, [String]) parse context usage options (ctx, args) = case getOpt RequireOrder options args of (parsers, cmds, []) -> do liftM (, cmds) $ Data.List.foldl' (\acc parser -> acc >>= parser context) (return ctx) parsers (_, _, errs) -> do usage >>= Write.fatal context . (W.vsep (map (W.text .TL.pack) errs) <>) . W.text . TL.pack