Scala 猫 OptionT:将 Future[Option[A]] 转换为 Future[Either[B]]
Scala cats OptionT: Convert Future[Option[A]] to Future[Either[B]]
我正在编写一个播放应用程序,其中有两个功能如下
- jwtUtils.decodePayload return 试一试
- userRepo.find return 是未来[选项[用户]]
然后我的refine fn如下图
def refine[A](request: Request[A]) = {
val jwtToken = request.headers.get("authorization").getOrElse("")
val currentUser = for {
json <- OptionT.fromOption[Future]( jwtUtils.decodePayload(jwtToken).toOption )
user <- OptionT( userRepo.find((json \ "sub").as[String].toLong) )
} yield user
currentUser.value match {
case fou : Future[Option[User]] => {
fou.map { ou =>
ou match {
case Some(user) => Right(new UserRequest(user, request))
case _ => Left(Forbidden)
}
}
}
case _ => Future.successful( Left(Forbidden) )
}
}
refine() fn 需要 return 一个 Future[Either]。有没有更好的方法来编写 refine fn 的后半部分来做到这一点?
看来您可以使用猫库中的 Either.fromOption
。
currentUser.value.map(opt =>
Either.fromOption(opt.map(new UserRequest(_, request)), Forbidden))
我正在编写一个播放应用程序,其中有两个功能如下
- jwtUtils.decodePayload return 试一试
- userRepo.find return 是未来[选项[用户]]
然后我的refine fn如下图
def refine[A](request: Request[A]) = {
val jwtToken = request.headers.get("authorization").getOrElse("")
val currentUser = for {
json <- OptionT.fromOption[Future]( jwtUtils.decodePayload(jwtToken).toOption )
user <- OptionT( userRepo.find((json \ "sub").as[String].toLong) )
} yield user
currentUser.value match {
case fou : Future[Option[User]] => {
fou.map { ou =>
ou match {
case Some(user) => Right(new UserRequest(user, request))
case _ => Left(Forbidden)
}
}
}
case _ => Future.successful( Left(Forbidden) )
}
}
refine() fn 需要 return 一个 Future[Either]。有没有更好的方法来编写 refine fn 的后半部分来做到这一点?
看来您可以使用猫库中的 Either.fromOption
。
currentUser.value.map(opt =>
Either.fromOption(opt.map(new UserRequest(_, request)), Forbidden))