{-# LANGUAGE FlexibleInstances #-}
module Conferer.FetchFromConfig.Warp
  (
  -- * How to use this
  -- | FetchFromConfig instance for warp server settings
  --
  -- @
  -- import Conferer
  -- import Conferer.FetchFromConfig.Warp ()
  --
  -- main = do
  --   config <- 'defaultConfig' \"awesomeapp\"
  --   warpSettings <- 'getFromConfig' \"warp\" config
  -- @
  ) where

import Conferer.Core
import Conferer.Types
import Conferer.FetchFromConfig.Basics
import Data.Either (rights)
import Network.Wai.Handler.Warp
import Data.String (fromString)
import Data.Text (unpack)

instance FetchFromConfig HostPreference where
    fetch = fetchFromConfigWith (pure . fromString . unpack)

instance FetchFromConfig Settings where
    fetch k config = do
        port <- fetch (k /. "port") config
        timeout <- fetch (k /. "timeout") config
        host <- fetch (k /. "host") config
        serverName <- fetch (k /. "serverName") config
        let overriders = rights [
                          setTimeout <$> timeout,
                          setHost <$> host,
                          setPort <$> port,
                          setServerName <$> serverName
                        ]
        return . return $ foldr ($) defaultSettings overriders