Я использую обычную монаду (с читателем), чтобы легко передавать данные, такие как пул БД, моим обработчикам (перед использованием пользовательской монады, которую я использовал для передачи соединения в качестве аргумента fn).Haskell Servant, передающий пользовательские данные обработчику auth
Это, как я определил свои собственные монады:
newtype Controller a = Controller
{ runController :: ReaderT ServerEnvironment Handler a
} deriving (Functor, Applicative, Monad, MonadReader ServerEnvironment,
MonadError ServantErr, MonadIO)
Это ServerEnvironment
только пользовательский тип данных я использую, чтобы нести мои данные.
Проблема заключается в том, что для моего AuthHandler
я должен специально использовать функцию с:
r -> Handler usr
в качестве обработчика аутентификации, я не могу использовать свой собственный обработчик, который будет:
r -> Controller usr
и я также не имеют возможности передать в моем ConnectionPool
, поскольку подпись не может быть:
ConnPool -> r -> Handler usr
Итак, как передать дополнительные данные обработчику аутентификации в servant без использования глобального состояния IO
?
что ... является хорошей отправной точкой ... – Reygoch
до сих пор, это не можно использовать обычную монаду для проверки подлинности? – Reygoch
Это - мы могли бы дать 'authenticate' подпись' Controller User', а затем 'let ctx = runReader (runController authenticate) env:. EmptyContext'. – user2141650