{-# LANGUAGE TupleSections #-}
module Hcompta.CLI.Args where

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
		Data.List.foldl' (\acc parser -> acc >>= parser context) (return ctx) parsers
		>>= return . (, cmds)
	 (_, _, errs) -> do
		usage >>= Write.fatal context .
			(W.vsep (map (W.text .TL.pack) errs) <>) .
			W.text . TL.pack