Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- {-# LANGUAGE DataKinds #-}
- {-# LANGUAGE ScopedTypeVariables #-}
- {-# LANGUAGE TypeOperators #-}
- {-# LANGUAGE DeriveGeneric #-}
- {-# LANGUAGE DeriveAnyClass #-}
- {-# LANGUAGE TypeApplications #-}
- {-# LANGUAGE OverloadedStrings #-}
- {-# LANGUAGE TypeFamilies #-}
- {-# LANGUAGE FlexibleInstances #-}
- {-# LANGUAGE MultiParamTypeClasses #-}
- --
- module Server.Servant where
- --
- import Data.Text ( Text , pack )
- import Data.Proxy ( Proxy (..) )
- import Data.ByteString.Char8 ( unpack )
- import Data.CaseInsensitive ( original )
- import Data.Aeson ( ToJSON , FromJSON )
- import Network.Wai ( Request , rawPathInfo , requestHeaders )
- import Network.Wai.Handler.Warp ( run )
- import Servant.API ( Verb , Get , PlainText , NoContent (..) , StdMethod (..) , (:>) )
- import Servant.API.Generic ( (:-) )
- import Servant.API.NamedRoutes ( NamedRoutes )
- import Servant.Server ( Handler , HasServer (..) , Context )
- import Servant.Server.Generic ( AsServer , AsServerT , genericServe , genericServeTWithContext )
- import Servant.Server.Internal.Delayed ( passToServer )
- import Servant.Auth ( JWT , Auth )
- import Servant.Auth.Server ( AuthResult , ToJWT , FromJWT , CookieSettings , JWTSettings )
- import GHC.Generics ( Generic )
- import Control.Monad.Trans.Reader ( ReaderT (..) )
- --
- type Head = Verb 'HEAD 200
- data Env = Env
- type AppM = ReaderT Env Handler
- data Looser = Looser
- { luID :: Int
- , luName :: String
- } deriving ( Eq , Show , Generic , ToJSON , FromJSON , ToJWT , FromJWT )
- data API mode = API
- { info :: mode :- Auth '[ JWT ] Looser :> "info" :> NamedRoutes InfoAPI
- } deriving ( Generic )
- data InfoAPI mode = InfoAPI
- { infoGet :: mode :- Get '[ PlainText ] Text
- , infoHead :: mode :- Head '[ PlainText ] NoContent
- } deriving ( Generic )
- main :: IO ()
- main = do
- let
- trn = flip runReaderT Env
- srv = srvr
- ctx = undefined :: Context '[ JWTSettings ]
- run 8088 $ genericServeTWithContext trn srv ctx
- srvr :: API ( AsServerT AppM )
- srvr = API
- { info = infoA
- }
- infoA :: AuthResult Looser -> InfoAPI ( AsServerT AppM )
- infoA u = InfoAPI
- { infoGet = handleInfoGet
- , infoHead = pure NoContent
- }
- handleInfoGet :: AppM Text
- handleInfoGet = undefined
Add Comment
Please, Sign In to add comment