2016-05-14 7 views
5

Temel KimlikServant

type SubApi = API1 :<|> API2 :<|> API3 
type API = BasicAuth "foo-realm" AuthData :> SubApi 

ile korunan bir API ile özel bir okuyucu Monad ile kimlik doğrulaması kullanılırken tip AuthData -> Handler a işleyicileri destekler.

handler1 :: Request1 -> AuthMonad Response 
handler2 :: Request2 -> AuthMonad Response 

bağlam AuthData kısmen oluşturulan bir ReaderT bir AuthMonad, çalışır:

I işleyicileri kümesi vardır. enter ve AuthMonad :~> Handler kullanarak, AuthData -> AuthMonad türünde Server API destekleyicileri destekleyebilirim, ancak gerçekten yapmak istediğim, runReaderT ortamını AuthData argümanını kullanmaktır.

Bunun nasıl yapılacağını anlamak için enter ile devam eden sihirbazlık türlerinden yeterince bilgim yok. Herhangi bir fikir?

+2

Bu yararlı olabilir Yukarıdaki durumda Ben doğal dönüşümü yaratacak bir işlevi yapılan 'AuthMonad' gerçek bildirimini eklediyseniz. Ayrıca, ne giriyorsun? Onun türünü sağlayamayacaksanız, en azından paketin içinde bulunduğu bir bağlantı sağlayın. – Kwarrtz

+0

Sanırım vücutta etiketlere ek olarak bahsetmeliydim, bu [haskell-hizmetçisine özgü bir sorudur. ] (https://hackage.haskell.org/package/servant) – ewestern

+0

İkinci Kwarrtz: Bence soru, AuthMonad hakkında daha fazla bilgi vermeden cevap vermek zor. Tanımını bilmeden gerekli olan doğal dönüşümü yazmak zordur. – hao

cevap

0

Sadece bunun asılı olduğunu unuttuğumu farkettim.

Çoğunlukla, bu düşünceyi aşmıştı - cevap oldukça açık.

enterAuth :: AuthData -> AuthMonad :~> Handler 

SERVERT oluştururken Sonra kullandı::

protectedServer :: AuthData -> ServerT ProtectedAPI Handler 
protectedServer ad = enter (enterAuth ad) protectedServer' 

genAuthServerContext :: Context (AuthHandler Request AuthData ': '[])