solidabis-koodihaaste/src/Server.hs

34 lines
1.0 KiB
Haskell

{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Server where
import Control.Monad.Reader (MonadReader, ask, asks, runReaderT)
import Control.Monad.Trans (MonadIO, liftIO)
import Data.Aeson (FromJSON)
import Network.Wai.Handler.Warp (run)
import Servant
import Servant.Server.Generic
import API (handler)
import Data.Language (HasModel)
import Solidabis.API (HasClientEnv, HasToken)
newtype Port = Port Int deriving (Show, FromJSON)
class HasPort a where
getPort :: a -> Port
setPort :: a -> Port -> a
instance HasPort Port where
getPort = id
setPort = const
app :: (HasModel r, HasClientEnv r, HasToken r) => r -> Application
app env = genericServeT (`runReaderT` env) API.handler
server
:: (HasModel r, HasClientEnv r, HasToken r, HasPort r, MonadReader r m, MonadIO m)
=> m ()
server = do
Port port <- asks getPort
ask >>= liftIO . run port . app