Guest User

Weird Servant Auth Type Check Error

a guest
Jul 21st, 2022
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. {-# LANGUAGE DataKinds #-}
  2. {-# LANGUAGE ScopedTypeVariables #-}
  3. {-# LANGUAGE TypeOperators #-}
  4. {-# LANGUAGE DeriveGeneric #-}
  5. {-# LANGUAGE DeriveAnyClass #-}
  6. {-# LANGUAGE TypeApplications #-}
  7. {-# LANGUAGE OverloadedStrings #-}
  8. {-# LANGUAGE TypeFamilies #-}
  9. {-# LANGUAGE FlexibleInstances #-}
  10. {-# LANGUAGE MultiParamTypeClasses #-}
  11. --
  12. module Server.Servant where
  13. --
  14. import Data.Text ( Text , pack )
  15. import Data.Proxy ( Proxy (..) )
  16. import Data.ByteString.Char8 ( unpack )
  17. import Data.CaseInsensitive ( original )
  18. import Data.Aeson ( ToJSON , FromJSON )
  19.  
  20. import Network.Wai ( Request , rawPathInfo , requestHeaders )
  21. import Network.Wai.Handler.Warp ( run )
  22.  
  23. import Servant.API ( Verb , Get , PlainText , NoContent (..) , StdMethod (..) , (:>) )
  24. import Servant.API.Generic ( (:-) )
  25. import Servant.API.NamedRoutes ( NamedRoutes )
  26. import Servant.Server ( Handler , HasServer (..) , Context )
  27. import Servant.Server.Generic ( AsServer , AsServerT , genericServe , genericServeTWithContext )
  28. import Servant.Server.Internal.Delayed ( passToServer )
  29.  
  30. import Servant.Auth ( JWT , Auth )
  31. import Servant.Auth.Server ( AuthResult , ToJWT , FromJWT , CookieSettings , JWTSettings )
  32.  
  33. import GHC.Generics ( Generic )
  34.  
  35. import Control.Monad.Trans.Reader ( ReaderT (..) )
  36. --
  37.  
  38. type Head = Verb 'HEAD 200
  39.  
  40. data Env = Env
  41.  
  42. type AppM = ReaderT Env Handler
  43.  
  44. data Looser = Looser
  45.  { luID :: Int
  46.  , luName :: String
  47.  } deriving ( Eq , Show , Generic , ToJSON , FromJSON , ToJWT , FromJWT )
  48.  
  49. data API mode = API
  50.  { info :: mode :- Auth '[ JWT ] Looser :> "info" :> NamedRoutes InfoAPI
  51.   } deriving ( Generic )
  52.  
  53. data InfoAPI mode = InfoAPI
  54.   { infoGet :: mode :- Get '[ PlainText ] Text
  55.  , infoHead :: mode :- Head '[ PlainText ] NoContent
  56.   } deriving ( Generic )
  57.  
  58. main :: IO ()
  59. main = do
  60.   let
  61.     trn = flip runReaderT Env
  62.     srv = srvr
  63.     ctx = undefined :: Context '[ JWTSettings ]
  64.  
  65.  run 8088 $ genericServeTWithContext trn srv ctx
  66.  
  67. srvr :: API ( AsServerT AppM )
  68. srvr = API
  69.  { info = infoA
  70.  }
  71.  
  72. infoA :: AuthResult Looser -> InfoAPI ( AsServerT AppM )
  73. infoA u = InfoAPI
  74.  { infoGet  = handleInfoGet
  75.  , infoHead = pure NoContent
  76.  }
  77.  
  78. handleInfoGet :: AppM Text
  79. handleInfoGet = undefined
Add Comment
Please, Sign In to add comment