简体   繁体   English

Scala 猫 OptionT:将 Future[Option[A]] 转换为 Future[Either[B]]

[英]Scala cats OptionT: Convert Future[Option[A]] to Future[Either[B]]

I am writing a play application in which I have 2 functions as follows我正在编写一个播放应用程序,其中有 2 个功能如下

  1. jwtUtils.decodePayload which returns a Try jwtUtils.decodePayload 返回一个 Try
  2. userRepo.find which returns a Future[Option[User]] userRepo.find 返回一个 Future[Option[User]]

And then my refine fn as shown below然后我细化 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) )
    }

}

The refine() fn needs to return a Future[Either].精炼() fn 需要返回一个Future[Either]。 Is there a better way to write the second half of the refine fn to do that ?有没有更好的方法来编写精炼 fn 的后半部分来做到这一点?

Seems like you can use Either.fromOption from cats library.似乎您可以使用猫库中的Either.fromOption

currentUser.value.map(opt => 
  Either.fromOption(opt.map(new UserRequest(_, request)), Forbidden)) 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM