packages feed

kitchen-sink-0.1.0.0: src/KitchenSink/Engine/MultiSiteConfig.hs

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedStrings #-}

module KitchenSink.Engine.MultiSiteConfig where

import Data.Aeson (FromJSON, ToJSON)
import GHC.Generics (Generic)

import KitchenSink.Engine.Config (ApiProxyConfig)
import KitchenSink.Engine.SiteConfig (SiteInfo)
import KitchenSink.Prelude

type HostName = Text

data KitchenSinkDirectorySourceStanza
    = KitchenSinkDirectorySourceStanza
    { path :: FilePath
    , metadata :: SiteInfo
    , execRoot :: Maybe FilePath
    }
    deriving (Generic, Show)
instance FromJSON KitchenSinkDirectorySourceStanza
instance ToJSON KitchenSinkDirectorySourceStanza

data SourceStanza
    = NoFiles
    | KitchenSinkDirectorySource KitchenSinkDirectorySourceStanza
    deriving (Generic, Show)
instance FromJSON SourceStanza
instance ToJSON SourceStanza

data CertificateFiles = CertificateFiles
    { pem :: FilePath
    , key :: FilePath
    }
    deriving (Generic, Show)
instance FromJSON CertificateFiles
instance ToJSON CertificateFiles

data CertificateSource
    = NoCertificates -- lazy way to force a {tag:/contents:} json serialization
    | CertificateFileSource CertificateFiles
    deriving (Generic, Show)
instance FromJSON CertificateSource
instance ToJSON CertificateSource

data TLSStanza = TLSStanza
    { sniDomains :: Maybe [HostName]
    , certificate :: CertificateSource
    }
    deriving (Generic, Show)
instance FromJSON TLSStanza
instance ToJSON TLSStanza

data SiteStanza = SiteStanza
    { domain :: HostName
    , extraDomains :: [HostName]
    , tls :: [TLSStanza]
    , site :: SourceStanza
    , api :: ApiProxyConfig
    }
    deriving (Generic, Show)
instance FromJSON SiteStanza
instance ToJSON SiteStanza

data FallbackStanza
    = FallbackWithOminousError
    | FallbackSite SiteStanza
    deriving (Generic, Show)
instance FromJSON FallbackStanza
instance ToJSON FallbackStanza

data MultiSiteConfig = MultiSiteConfig
    { services :: [SiteStanza]
    , fallback :: FallbackStanza
    }
    deriving (Generic, Show)
instance FromJSON MultiSiteConfig
instance ToJSON MultiSiteConfig