{-# LANGUAGE ConstraintKinds #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE EmptyCase #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE InstanceSigs #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE PolyKinds #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE TypeOperators #-} {-# LANGUAGE UndecidableInstances #-} module Main where import Data.Char (toLower) import Data.Proxy (Proxy(Proxy)) import Network.Wai (Application) import Network.Wai.Handler.Warp (run) import Servant (Handler, (:<|>)((:<|>)), ServerT, serve) import Servant.Checked.Exceptions (Envelope, pureErrEnvelope, pureSuccEnvelope) import Api (Api, BadSearchTermErr(BadSearchTermErr), IncorrectCapitalization(IncorrectCapitalization), SearchQuery(SearchQuery), SearchResponse, port) serverRoot :: ServerT Api Handler serverRoot = postStrictSearch :<|> postLaxSearch postStrictSearch :: SearchQuery -> Handler (Envelope '[BadSearchTermErr, IncorrectCapitalization] SearchResponse) postStrictSearch (SearchQuery "Hello") = pureSuccEnvelope "good" postStrictSearch (SearchQuery query) | fmap toLower query == "hello" = pureErrEnvelope IncorrectCapitalization | otherwise = pureErrEnvelope BadSearchTermErr postLaxSearch :: SearchQuery -> Handler (Envelope '[BadSearchTermErr] SearchResponse) postLaxSearch (SearchQuery query) | fmap toLower query == "hello" = pureSuccEnvelope "good" | otherwise = pureErrEnvelope BadSearchTermErr app :: Application app = serve (Proxy :: Proxy Api) serverRoot main :: IO () main = run port app