packages feed

wikimusic-ssr-1.0.1.6: src/WikiMusic/SSR/Model/Config.hs

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

module WikiMusic.SSR.Model.Config
  ( AppConfig (..),
    ServantConfig (..),
    CorsConfig (..),
    CookieConfig (..),
    WebFrontendConfig (..),
    appConfigCodec,
  )
where

import Optics
import Relude
import Toml

data ServantConfig = ServantConfig
  { port :: Int,
    host :: Text
  }
  deriving (Generic, Eq, Show)

servantConfigCodec :: TomlCodec ServantConfig
servantConfigCodec =
  ServantConfig
    <$> Toml.int "port"
    .= (^. #port)
    <*> Toml.text "host"
    .= (^. #host)

data CorsConfig = CorsConfig
  { origins :: [Text],
    methods :: [Text],
    requestHeaders :: [Text]
  }
  deriving (Generic, Eq, Show)

corsConfigCodec :: TomlCodec CorsConfig
corsConfigCodec =
  CorsConfig
    <$> Toml.arrayOf Toml._Text "origins"
    .= (^. #origins)
    <*> Toml.arrayOf Toml._Text "methods"
    .= (^. #methods)
    <*> Toml.arrayOf Toml._Text "request-headers"
    .= (^. #requestHeaders)

data CookieConfig = CookieConfig
  { maxAge :: Int,
    path :: Text,
    domain :: Text,
    secure :: Bool,
    sameSite :: Text
  }
  deriving (Generic, Eq, Show)

cookieConfigCodec :: TomlCodec CookieConfig
cookieConfigCodec =
  CookieConfig
    <$> Toml.int "max-age"
    .= (^. #maxAge)
    <*> Toml.text "path"
    .= (^. #path)
    <*> Toml.text "domain"
    .= (^. #domain)
    <*> Toml.bool "secure"
    .= (^. #secure)
    <*> Toml.text "same-site"
    .= (^. #sameSite)

newtype DevConfig = DevConfig
  { reportedVersion :: Text
  }
  deriving (Generic, Eq, Show)

devCodec :: TomlCodec DevConfig
devCodec = DevConfig <$> Toml.text "reported-version" .= (^. #reportedVersion)

data WebFrontendConfig = WebFrontendConfig
  { baseUrl :: Text,
    staticFileDir :: Text
  }
  deriving (Generic, Eq, Show)

webFrontendConfigCodec :: TomlCodec WebFrontendConfig
webFrontendConfigCodec =
  WebFrontendConfig
    <$> Toml.text "base-url"
    .= (^. #baseUrl)
    <*> Toml.text "static-file-dir"
    .= (^. #staticFileDir)

data ApiConfig = ApiConfig
  { host :: Text,
    port :: Int,
    protocol :: Text
  }
  deriving (Generic, Eq, Show)

apiConfigCodec :: TomlCodec ApiConfig
apiConfigCodec =
  ApiConfig
    <$> Toml.text "host"
    .= (^. #host)
    <*> Toml.int "port"
    .= (^. #port)
    <*> Toml.text "protocol"
    .= (^. #protocol)

data AppConfig = AppConfig
  { servant :: ServantConfig,
    cors :: CorsConfig,
    cookie :: CookieConfig,
    webFrontend :: WebFrontendConfig,
    dev :: DevConfig,
    api :: ApiConfig
  }
  deriving (Generic, Eq, Show)

appConfigCodec :: TomlCodec AppConfig
appConfigCodec =
  AppConfig
    <$> Toml.table servantConfigCodec "servant"
    .= (^. #servant)
    <*> Toml.table corsConfigCodec "cors"
    .= (^. #cors)
    <*> Toml.table cookieConfigCodec "cookie"
    .= (^. #cookie)
    <*> Toml.table webFrontendConfigCodec "web-frontend"
    .= (^. #webFrontend)
    <*> Toml.table devCodec "dev"
    .= (^. #dev)
    <*> Toml.table apiConfigCodec "api"
    .= (^. #api)

makeFieldLabelsNoPrefix ''AppConfig
makeFieldLabelsNoPrefix ''ServantConfig
makeFieldLabelsNoPrefix ''CorsConfig
makeFieldLabelsNoPrefix ''CookieConfig
makeFieldLabelsNoPrefix ''WebFrontendConfig
makeFieldLabelsNoPrefix ''DevConfig
makeFieldLabelsNoPrefix ''ApiConfig