{-# LANGUAGE LambdaCase #-} module Hcompta.CLI.Command.Print where -- import Control.Arrow ((>>>)) import Control.Monad.IO.Class (liftIO) import Control.Monad.Trans.Except (runExceptT) import qualified Data.Either import qualified Data.List import System.Console.GetOpt ( ArgDescr(..) , OptDescr(..) , usageInfo ) import System.Environment (getProgName) import System.Exit (exitWith, ExitCode(..)) import qualified System.IO as IO import qualified Hcompta.CLI.Args as Args import qualified Hcompta.CLI.Context as Context import qualified Hcompta.CLI.Write as Write import qualified Hcompta.Format.Ledger.Read import qualified Hcompta.Format.Ledger.Write import qualified Hcompta.Format.Ledger.Journal import qualified Hcompta.Model.Journal data Ctx = Ctx { ctx_input :: [FilePath] } deriving (Eq, Show) nil :: Ctx nil = Ctx { ctx_input = [] } usage :: IO String usage = do bin <- getProgName return $unlines $ [ "SYNTAX " , " "++bin++" print [option..]" , "" , usageInfo "OPTIONS" options ] options :: Args.Options Ctx options = [ Option "h" ["help"] (NoArg (\_ctx -> do usage >>= IO.hPutStr IO.stderr exitWith ExitSuccess)) "show this help" , Option "i" ["input"] (ReqArg (\s ctx -> do return $ ctx{ctx_input=s:ctx_input ctx}) "file.ledger") "read data from given file" ] run :: Context.Context -> [String] -> IO () run context args = do (ctx, _) <- Args.parse context usage options (nil, args) (flip mapM) (ctx_input ctx) $ \path -> do liftIO $ runExceptT $ Hcompta.Format.Ledger.Read.file path >>= \case Left ko -> return $ Left (path, ko) Right ok -> return $ Right ok >>= return . Data.Either.partitionEithers >>= \case (kos@(_:_), _oks) -> (flip mapM_) kos $ \(_path, ko) -> Write.fatal context ko ([], journals) -> do with_color <- Write.with_color context IO.stdout let journal = Hcompta.Model.Journal.unions $ Data.List.map Hcompta.Format.Ledger.Journal.to_Model journals Hcompta.Format.Ledger.Write.showIO with_color IO.stdout $ do Hcompta.Format.Ledger.Write.journal journal