{-# LANGUAGE OverloadedStrings #-} -- | This module parses the config file. module Config ( Config (..), parseConfig, ) where import AppId (AppId (..)) import Data.Currency (Alpha) import Relude import Toml (TomlBiMap, TomlCodec, prettyTomlDecodeErrors, (.=)) import qualified Toml data Config = Config { configOpenExchangeRateAppId :: !AppId , configBaseCurrency :: !Alpha , configTargetCurrencies :: [Alpha] } deriving stock (Show, Eq) alphaBiMap :: TomlBiMap Data.Currency.Alpha Toml.AnyValue alphaBiMap = Toml._EnumBounded currencyBiMap :: TomlBiMap Alpha Toml.AnyValue currencyBiMap = alphaBiMap configCodec :: TomlCodec Config configCodec = Config <$> Toml.diwrap (Toml.text "oer_app_id") .= configOpenExchangeRateAppId <*> Toml.match currencyBiMap "currency.base" .= configBaseCurrency <*> Toml.arrayOf currencyBiMap "currency.targets" .= configTargetCurrencies parseConfig :: Text -> Either Text Config parseConfig = first prettyTomlDecodeErrors . Toml.decode configCodec