packages feed

wikimusic-api-1.2.0.8: src/WikiMusic/Config.hs

{-# LANGUAGE OverloadedLabels #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE NoFieldSelectors #-}

module WikiMusic.Config (readConfig) where

import Data.ByteString.Lazy qualified as BL
import Data.Text (strip, unpack)
import Data.Text.Encoding qualified
import Toml
import WikiMusic.Model.Config
import WikiMusic.Protolude

readConfig :: (MonadIO m) => Text -> m (Either Text AppConfig)
readConfig filePath = do
  parseResult <- liftIO $ decodeFileEither appConfigCodec (unpack filePath)
  case parseResult of
    Left e -> pure . Left $ prettyTomlDecodeErrors e
    Right r -> readSecrets r <&> Right

readSecrets :: (MonadIO m) => AppConfig -> m AppConfig
readSecrets cfg = do
  mailPassword <- readSecretFromFile cfg (^. #mail % #passwordFile)
  mailUser <- readSecretFromFile cfg (^. #mail % #userFile)
  let mailConfig = cfg ^. #mail
  let finalCfg =
        cfg
          { mail =
              mailConfig
                { password = Just mailPassword,
                  user = Just mailUser
                }
          }

  pure finalCfg

readSecretFromFile :: (MonadIO m) => t -> (t -> Text) -> m Text
readSecretFromFile cfg getFilePath = do
  passwordFileContents <- liftIO . BL.readFile . unpack . getFilePath $ cfg
  pure
    . strip
    . Data.Text.Encoding.decodeUtf8
    . BL.toStrict
    $ passwordFileContents