使用基本身份验证保护的API
type SubApi = API1 :<|> API2 :<|> API3
type API = BasicAuth "foo-realm" AuthData :> SubApi
支持AuthData -> Handler a
类型的处理程序。
我有一套处理程序:
handler1 :: Request1 -> AuthMonad Response
handler2 :: Request2 -> AuthMonad Response
在AuthMonad中运行,这是一个ReaderT,其上下文部分来自AuthData。
使用enter
和AuthMonad :~> Handler
,我可以获得Server API
类型AuthData -> AuthMonad
的支持处理程序,但我真正想做的是使用AuthData
参数作为runReaderT的环境。
我不太了解enter
正在进行的类型向导,以了解如何执行此操作。有任何想法吗?
答案 0 :(得分:0)
刚刚意识到我把这个挂了。
大多数情况下,只是过度思考这一点 - 答案非常明显。 在上面的例子中,我创建了一个可以创建自然变换的函数:
enterAuth :: AuthData -> AuthMonad :~> Handler
我在构建ServerT时使用了它:
protectedServer :: AuthData -> ServerT ProtectedAPI Handler
protectedServer ad = enter (enterAuth ad) protectedServer'
,其中
genAuthServerContext :: Context (AuthHandler Request AuthData ': '[])