{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeApplications #-}
{-# OPTIONS_GHC -Wno-orphans #-}
module Main where
import Control.Lens
import Data.Aeson hiding ((.=))
import qualified Data.ByteString.Lazy as BL
import Data.Foldable
import Data.Map (Map)
import Data.Text (Text)
import qualified Data.Text.Lazy as TL
import qualified Data.Text.Lazy.Encoding as TL
import qualified Data.Text.Lazy.IO as TL
import GHC.Generics hiding (to)
import Journal.Amount
import Journal.Model
import Journal.Parse
import Options
import Text.Megaparsec (parse)
import Text.Megaparsec.Error
data Config = Config
{ splits :: Map Text [Amount 6],
rounding :: Map Text (Amount 2)
}
deriving (Generic, Show, FromJSON)
newConfig :: Config
newConfig =
Config
{ splits = mempty,
rounding = mempty
}
parseProcessPrint :: MonadFail m => FilePath -> TL.Text -> m TL.Text
parseProcessPrint path journal = do
actions <- case parse parseJournal path journal of
Left e -> fail $ errorBundlePretty e
Right res -> pure res
case processJournal actions of
Left err ->
error $ "Error processing journal " ++ path ++ ": " ++ show err
Right j -> pure $ printJournal j
main :: IO ()
main = do
opts <- getOptions
forM_ (opts ^. files) $ \path -> do
putStrLn $ "Reading journal " ++ path
journal <- TL.decodeUtf8 <$> BL.readFile path
TL.putStrLn =<< parseProcessPrint path journal