packages feed

tricorder-0.6.0.0: src/Tricorder/Config.hs

module Tricorder.Config
    ( Config (..)
    , asInput
    )
where

import Atelier.Effects.Input (Input)
import Atelier.Types.JSON.QuietSnake (QuietSnake (..))
import Atelier.Types.WithDefaults (WithDefaults (..))
import Data.Aeson (FromJSON, ToJSON)
import Data.Default (Default (..))

import Atelier.Effects.Input qualified as Input
import Data.Aeson qualified as Aeson
import Data.Yaml qualified as Yaml

import Tricorder.Config.LoadedConfig (LoadedConfig (..))

import Tricorder.Session.Config qualified as Session (Config)


data Config = Config
    { session :: Maybe Session.Config
    }
    deriving stock (Eq, Generic, Show)
    deriving (ToJSON) via QuietSnake Config
    deriving (FromJSON) via WithDefaults (QuietSnake Config)


instance Default Config where
    def =
        Config
            { session = def
            }


asInput
    :: (Input LoadedConfig :> es)
    => Eff (Input (Either Text Config) : es) a -> Eff es a
asInput = Input.withEff do
    LoadedConfig bs <- Input.input
    case Yaml.decodeEither' bs of
        Right Aeson.Null -> pure $ Right def
        _ -> pure $ first (toText . Yaml.prettyPrintParseException) $ Yaml.decodeEither' bs