packages feed

trade-journal-0.0.1: Main.hs

{-# 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