Scala cats OptionT: конвертировать будущее [опция [A]] в будущее [либо [B]] - PullRequest
0 голосов
/ 05 ноября 2018

Я пишу игровое приложение, в котором у меня есть 2 функции следующим образом

  1. jwtUtils.decodePayload, который возвращает Try
  2. userRepo.find, который возвращает будущее [Option [User]]

А затем мой уточненный 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) )
    }

}

Уточнение () fn должно вернуть Future [Either]. Есть ли лучший способ написать вторую половину уточнения Fn для этого?

1 Ответ

0 голосов
/ 05 ноября 2018

Похоже, вы можете использовать Either.fromOption из библиотеки кошек.

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