{-# LANGUAGE OverloadedStrings #-}
module Main (main) where
import Config (
Config (..),
parseConfig,
)
import qualified Data.Text.IO as T
import Ledger (ratesToLedger)
import OpenExchangeRates (fetchRates)
import Options.Applicative (
Parser,
execParser,
fullDesc,
header,
help,
helper,
info,
long,
metavar,
progDesc,
strOption,
)
import Relude
newtype ConfigFilePath = ConfigFilePath FilePath
deriving newtype (Show, Eq)
configFilePathP :: Parser ConfigFilePath
configFilePathP =
ConfigFilePath
<$> strOption
( long "config_file"
<> metavar "FILE"
<> help "The TOML config file."
)
run :: ConfigFilePath -> IO ()
run (ConfigFilePath configFilePath) = do
eitherConfig <- parseConfig <$> T.readFile configFilePath
case eitherConfig of
Left err -> do
T.hPutStrLn stderr "Could not parse the config file."
T.hPutStrLn stderr err
exitFailure
Right config@(Config _appId base _) -> do
oerResult <- fetchRates config
case oerResult of
Left err -> do
T.hPutStrLn stderr "Could not fetch rates from OER."
T.hPutStrLn stderr err
exitFailure
Right rates -> do
T.putStr $ ratesToLedger base rates
main :: IO ()
main = do
configFilePath <- execParser opts
run configFilePath
where
opts =
info
(configFilePathP <**> helper)
( fullDesc
<> progDesc "Print Forex rates in Ledger format."
<> header "forex2ledger"
)