module Mensam.Server.Configuration where

import Mensam.API.Aeson
import Mensam.Server.Configuration.BaseUrl
import Mensam.Server.Configuration.Email
import Mensam.Server.Configuration.SQLite

import Control.DeepSeq
import Data.Aeson qualified as A
import Data.Kind
import Data.List.NonEmpty qualified as NE
import Data.Text qualified as T
import Data.Word
import Deriving.Aeson qualified as A
import GHC.Generics

type Configuration :: Type
data Configuration = Configuration
  { Configuration -> Maybe Text
configRevision :: Maybe T.Text
  , Configuration -> SQLiteConfig
configSqlite :: SQLiteConfig
  , Configuration -> Maybe EmailConfig
configEmailConfig :: Maybe EmailConfig
  , Configuration -> FilePath
configDirectoryStatic :: FilePath
  , Configuration -> Word16
configPort :: Word16
  , Configuration -> BaseUrl
configBaseUrl :: BaseUrl
  , Configuration -> [FontConfig]
configFonts :: [FontConfig]
  , Configuration -> AuthConfig
configAuth :: AuthConfig
  , Configuration -> Maybe FilePath
configDirectoryHaddock :: Maybe FilePath
  , Configuration -> Maybe Text
configSourceUrl :: Maybe T.Text
  }
  deriving stock (Configuration -> Configuration -> Bool
(Configuration -> Configuration -> Bool)
-> (Configuration -> Configuration -> Bool) -> Eq Configuration
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Configuration -> Configuration -> Bool
== :: Configuration -> Configuration -> Bool
$c/= :: Configuration -> Configuration -> Bool
/= :: Configuration -> Configuration -> Bool
Eq, (forall x. Configuration -> Rep Configuration x)
-> (forall x. Rep Configuration x -> Configuration)
-> Generic Configuration
forall x. Rep Configuration x -> Configuration
forall x. Configuration -> Rep Configuration x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Configuration -> Rep Configuration x
from :: forall x. Configuration -> Rep Configuration x
$cto :: forall x. Rep Configuration x -> Configuration
to :: forall x. Rep Configuration x -> Configuration
Generic, Eq Configuration
Eq Configuration =>
(Configuration -> Configuration -> Ordering)
-> (Configuration -> Configuration -> Bool)
-> (Configuration -> Configuration -> Bool)
-> (Configuration -> Configuration -> Bool)
-> (Configuration -> Configuration -> Bool)
-> (Configuration -> Configuration -> Configuration)
-> (Configuration -> Configuration -> Configuration)
-> Ord Configuration
Configuration -> Configuration -> Bool
Configuration -> Configuration -> Ordering
Configuration -> Configuration -> Configuration
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: Configuration -> Configuration -> Ordering
compare :: Configuration -> Configuration -> Ordering
$c< :: Configuration -> Configuration -> Bool
< :: Configuration -> Configuration -> Bool
$c<= :: Configuration -> Configuration -> Bool
<= :: Configuration -> Configuration -> Bool
$c> :: Configuration -> Configuration -> Bool
> :: Configuration -> Configuration -> Bool
$c>= :: Configuration -> Configuration -> Bool
>= :: Configuration -> Configuration -> Bool
$cmax :: Configuration -> Configuration -> Configuration
max :: Configuration -> Configuration -> Configuration
$cmin :: Configuration -> Configuration -> Configuration
min :: Configuration -> Configuration -> Configuration
Ord, ReadPrec [Configuration]
ReadPrec Configuration
Int -> ReadS Configuration
ReadS [Configuration]
(Int -> ReadS Configuration)
-> ReadS [Configuration]
-> ReadPrec Configuration
-> ReadPrec [Configuration]
-> Read Configuration
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS Configuration
readsPrec :: Int -> ReadS Configuration
$creadList :: ReadS [Configuration]
readList :: ReadS [Configuration]
$creadPrec :: ReadPrec Configuration
readPrec :: ReadPrec Configuration
$creadListPrec :: ReadPrec [Configuration]
readListPrec :: ReadPrec [Configuration]
Read, Int -> Configuration -> ShowS
[Configuration] -> ShowS
Configuration -> FilePath
(Int -> Configuration -> ShowS)
-> (Configuration -> FilePath)
-> ([Configuration] -> ShowS)
-> Show Configuration
forall a.
(Int -> a -> ShowS) -> (a -> FilePath) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Configuration -> ShowS
showsPrec :: Int -> Configuration -> ShowS
$cshow :: Configuration -> FilePath
show :: Configuration -> FilePath
$cshowList :: [Configuration] -> ShowS
showList :: [Configuration] -> ShowS
Show)
  deriving anyclass (Configuration -> ()
(Configuration -> ()) -> NFData Configuration
forall a. (a -> ()) -> NFData a
$crnf :: Configuration -> ()
rnf :: Configuration -> ()
NFData)
  deriving
    (Value -> Parser [Configuration]
Value -> Parser Configuration
(Value -> Parser Configuration)
-> (Value -> Parser [Configuration]) -> FromJSON Configuration
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
$cparseJSON :: Value -> Parser Configuration
parseJSON :: Value -> Parser Configuration
$cparseJSONList :: Value -> Parser [Configuration]
parseJSONList :: Value -> Parser [Configuration]
A.FromJSON, [Configuration] -> Value
[Configuration] -> Encoding
Configuration -> Value
Configuration -> Encoding
(Configuration -> Value)
-> (Configuration -> Encoding)
-> ([Configuration] -> Value)
-> ([Configuration] -> Encoding)
-> ToJSON Configuration
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
$ctoJSON :: Configuration -> Value
toJSON :: Configuration -> Value
$ctoEncoding :: Configuration -> Encoding
toEncoding :: Configuration -> Encoding
$ctoJSONList :: [Configuration] -> Value
toJSONList :: [Configuration] -> Value
$ctoEncodingList :: [Configuration] -> Encoding
toEncodingList :: [Configuration] -> Encoding
A.ToJSON)
    via A.CustomJSON (JSONSettings "" "config") Configuration

type AuthConfig :: Type
newtype AuthConfig = AuthConfig
  { AuthConfig -> Maybe Integer
authTimeoutSeconds :: Maybe Integer
  }
  deriving stock (AuthConfig -> AuthConfig -> Bool
(AuthConfig -> AuthConfig -> Bool)
-> (AuthConfig -> AuthConfig -> Bool) -> Eq AuthConfig
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: AuthConfig -> AuthConfig -> Bool
== :: AuthConfig -> AuthConfig -> Bool
$c/= :: AuthConfig -> AuthConfig -> Bool
/= :: AuthConfig -> AuthConfig -> Bool
Eq, (forall x. AuthConfig -> Rep AuthConfig x)
-> (forall x. Rep AuthConfig x -> AuthConfig) -> Generic AuthConfig
forall x. Rep AuthConfig x -> AuthConfig
forall x. AuthConfig -> Rep AuthConfig x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. AuthConfig -> Rep AuthConfig x
from :: forall x. AuthConfig -> Rep AuthConfig x
$cto :: forall x. Rep AuthConfig x -> AuthConfig
to :: forall x. Rep AuthConfig x -> AuthConfig
Generic, Eq AuthConfig
Eq AuthConfig =>
(AuthConfig -> AuthConfig -> Ordering)
-> (AuthConfig -> AuthConfig -> Bool)
-> (AuthConfig -> AuthConfig -> Bool)
-> (AuthConfig -> AuthConfig -> Bool)
-> (AuthConfig -> AuthConfig -> Bool)
-> (AuthConfig -> AuthConfig -> AuthConfig)
-> (AuthConfig -> AuthConfig -> AuthConfig)
-> Ord AuthConfig
AuthConfig -> AuthConfig -> Bool
AuthConfig -> AuthConfig -> Ordering
AuthConfig -> AuthConfig -> AuthConfig
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: AuthConfig -> AuthConfig -> Ordering
compare :: AuthConfig -> AuthConfig -> Ordering
$c< :: AuthConfig -> AuthConfig -> Bool
< :: AuthConfig -> AuthConfig -> Bool
$c<= :: AuthConfig -> AuthConfig -> Bool
<= :: AuthConfig -> AuthConfig -> Bool
$c> :: AuthConfig -> AuthConfig -> Bool
> :: AuthConfig -> AuthConfig -> Bool
$c>= :: AuthConfig -> AuthConfig -> Bool
>= :: AuthConfig -> AuthConfig -> Bool
$cmax :: AuthConfig -> AuthConfig -> AuthConfig
max :: AuthConfig -> AuthConfig -> AuthConfig
$cmin :: AuthConfig -> AuthConfig -> AuthConfig
min :: AuthConfig -> AuthConfig -> AuthConfig
Ord, ReadPrec [AuthConfig]
ReadPrec AuthConfig
Int -> ReadS AuthConfig
ReadS [AuthConfig]
(Int -> ReadS AuthConfig)
-> ReadS [AuthConfig]
-> ReadPrec AuthConfig
-> ReadPrec [AuthConfig]
-> Read AuthConfig
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS AuthConfig
readsPrec :: Int -> ReadS AuthConfig
$creadList :: ReadS [AuthConfig]
readList :: ReadS [AuthConfig]
$creadPrec :: ReadPrec AuthConfig
readPrec :: ReadPrec AuthConfig
$creadListPrec :: ReadPrec [AuthConfig]
readListPrec :: ReadPrec [AuthConfig]
Read, Int -> AuthConfig -> ShowS
[AuthConfig] -> ShowS
AuthConfig -> FilePath
(Int -> AuthConfig -> ShowS)
-> (AuthConfig -> FilePath)
-> ([AuthConfig] -> ShowS)
-> Show AuthConfig
forall a.
(Int -> a -> ShowS) -> (a -> FilePath) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> AuthConfig -> ShowS
showsPrec :: Int -> AuthConfig -> ShowS
$cshow :: AuthConfig -> FilePath
show :: AuthConfig -> FilePath
$cshowList :: [AuthConfig] -> ShowS
showList :: [AuthConfig] -> ShowS
Show)
  deriving anyclass (AuthConfig -> ()
(AuthConfig -> ()) -> NFData AuthConfig
forall a. (a -> ()) -> NFData a
$crnf :: AuthConfig -> ()
rnf :: AuthConfig -> ()
NFData)
  deriving
    (Value -> Parser [AuthConfig]
Value -> Parser AuthConfig
(Value -> Parser AuthConfig)
-> (Value -> Parser [AuthConfig]) -> FromJSON AuthConfig
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
$cparseJSON :: Value -> Parser AuthConfig
parseJSON :: Value -> Parser AuthConfig
$cparseJSONList :: Value -> Parser [AuthConfig]
parseJSONList :: Value -> Parser [AuthConfig]
A.FromJSON, [AuthConfig] -> Value
[AuthConfig] -> Encoding
AuthConfig -> Value
AuthConfig -> Encoding
(AuthConfig -> Value)
-> (AuthConfig -> Encoding)
-> ([AuthConfig] -> Value)
-> ([AuthConfig] -> Encoding)
-> ToJSON AuthConfig
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
$ctoJSON :: AuthConfig -> Value
toJSON :: AuthConfig -> Value
$ctoEncoding :: AuthConfig -> Encoding
toEncoding :: AuthConfig -> Encoding
$ctoJSONList :: [AuthConfig] -> Value
toJSONList :: [AuthConfig] -> Value
$ctoEncodingList :: [AuthConfig] -> Encoding
toEncodingList :: [AuthConfig] -> Encoding
A.ToJSON)
    via A.CustomJSON (JSONSettings "" "auth") AuthConfig

type FontConfig :: Type
data FontConfig = FontConfig
  { FontConfig -> NonEmpty Text
fontPathPieces :: NE.NonEmpty T.Text
  , FontConfig -> Bool
fontPreload :: Bool
  }
  deriving stock (FontConfig -> FontConfig -> Bool
(FontConfig -> FontConfig -> Bool)
-> (FontConfig -> FontConfig -> Bool) -> Eq FontConfig
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: FontConfig -> FontConfig -> Bool
== :: FontConfig -> FontConfig -> Bool
$c/= :: FontConfig -> FontConfig -> Bool
/= :: FontConfig -> FontConfig -> Bool
Eq, (forall x. FontConfig -> Rep FontConfig x)
-> (forall x. Rep FontConfig x -> FontConfig) -> Generic FontConfig
forall x. Rep FontConfig x -> FontConfig
forall x. FontConfig -> Rep FontConfig x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. FontConfig -> Rep FontConfig x
from :: forall x. FontConfig -> Rep FontConfig x
$cto :: forall x. Rep FontConfig x -> FontConfig
to :: forall x. Rep FontConfig x -> FontConfig
Generic, Eq FontConfig
Eq FontConfig =>
(FontConfig -> FontConfig -> Ordering)
-> (FontConfig -> FontConfig -> Bool)
-> (FontConfig -> FontConfig -> Bool)
-> (FontConfig -> FontConfig -> Bool)
-> (FontConfig -> FontConfig -> Bool)
-> (FontConfig -> FontConfig -> FontConfig)
-> (FontConfig -> FontConfig -> FontConfig)
-> Ord FontConfig
FontConfig -> FontConfig -> Bool
FontConfig -> FontConfig -> Ordering
FontConfig -> FontConfig -> FontConfig
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: FontConfig -> FontConfig -> Ordering
compare :: FontConfig -> FontConfig -> Ordering
$c< :: FontConfig -> FontConfig -> Bool
< :: FontConfig -> FontConfig -> Bool
$c<= :: FontConfig -> FontConfig -> Bool
<= :: FontConfig -> FontConfig -> Bool
$c> :: FontConfig -> FontConfig -> Bool
> :: FontConfig -> FontConfig -> Bool
$c>= :: FontConfig -> FontConfig -> Bool
>= :: FontConfig -> FontConfig -> Bool
$cmax :: FontConfig -> FontConfig -> FontConfig
max :: FontConfig -> FontConfig -> FontConfig
$cmin :: FontConfig -> FontConfig -> FontConfig
min :: FontConfig -> FontConfig -> FontConfig
Ord, ReadPrec [FontConfig]
ReadPrec FontConfig
Int -> ReadS FontConfig
ReadS [FontConfig]
(Int -> ReadS FontConfig)
-> ReadS [FontConfig]
-> ReadPrec FontConfig
-> ReadPrec [FontConfig]
-> Read FontConfig
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS FontConfig
readsPrec :: Int -> ReadS FontConfig
$creadList :: ReadS [FontConfig]
readList :: ReadS [FontConfig]
$creadPrec :: ReadPrec FontConfig
readPrec :: ReadPrec FontConfig
$creadListPrec :: ReadPrec [FontConfig]
readListPrec :: ReadPrec [FontConfig]
Read, Int -> FontConfig -> ShowS
[FontConfig] -> ShowS
FontConfig -> FilePath
(Int -> FontConfig -> ShowS)
-> (FontConfig -> FilePath)
-> ([FontConfig] -> ShowS)
-> Show FontConfig
forall a.
(Int -> a -> ShowS) -> (a -> FilePath) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> FontConfig -> ShowS
showsPrec :: Int -> FontConfig -> ShowS
$cshow :: FontConfig -> FilePath
show :: FontConfig -> FilePath
$cshowList :: [FontConfig] -> ShowS
showList :: [FontConfig] -> ShowS
Show)
  deriving anyclass (FontConfig -> ()
(FontConfig -> ()) -> NFData FontConfig
forall a. (a -> ()) -> NFData a
$crnf :: FontConfig -> ()
rnf :: FontConfig -> ()
NFData)
  deriving
    (Value -> Parser [FontConfig]
Value -> Parser FontConfig
(Value -> Parser FontConfig)
-> (Value -> Parser [FontConfig]) -> FromJSON FontConfig
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
$cparseJSON :: Value -> Parser FontConfig
parseJSON :: Value -> Parser FontConfig
$cparseJSONList :: Value -> Parser [FontConfig]
parseJSONList :: Value -> Parser [FontConfig]
A.FromJSON, [FontConfig] -> Value
[FontConfig] -> Encoding
FontConfig -> Value
FontConfig -> Encoding
(FontConfig -> Value)
-> (FontConfig -> Encoding)
-> ([FontConfig] -> Value)
-> ([FontConfig] -> Encoding)
-> ToJSON FontConfig
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
$ctoJSON :: FontConfig -> Value
toJSON :: FontConfig -> Value
$ctoEncoding :: FontConfig -> Encoding
toEncoding :: FontConfig -> Encoding
$ctoJSONList :: [FontConfig] -> Value
toJSONList :: [FontConfig] -> Value
$ctoEncodingList :: [FontConfig] -> Encoding
toEncodingList :: [FontConfig] -> Encoding
A.ToJSON)
    via A.CustomJSON (JSONSettings "" "font") FontConfig