2

我正在使用 cookie 和基本身份验证的组合。在基本认证中,它需要一个函数

Option[UserPass] => Future[Option[T]]

并返回一个Directive[T].

我希望在 cookie 上创建一个指令,它需要一个函数

HttpCookie => Future[T]

并返回一个Directive[T].

因此我可以做一个组合的 auth 指令cookieAuth | basicAuth

我能得到的最接近的是:

def myFunction:HttpCookie => Future[String]

val cookieAuth:Directive[String] = cookie("MyCookie").flatMap { cookie =>
  onSuccess(myFunction(cookie))
}

但签名不匹配。我得到了例外:

type mismatch;
  found   : spray.routing.Directive[shapeless.::[String,shapeless.HNil]]
  required: spray.routing.Directive[String]
         ^ 
4

1 回答 1

3

tl;dr生成 type 的结果Directive1[String]

最初的问题是类型不匹配。pure Directivetrait 采用上限为 的类型参数,HList因此结果类型基于 Shapeless 的HList Directive[String :: HNil]

routing声明为Directive[HNil]Directive[T :: HNil]Directive0Directive1[T]分别键入别名的包对象中。

于 2013-10-07T11:15:34.597 回答