Один из вариантов - выбросить исключение, которое завершится с ошибкой Future
, а затем recover
в Left
, например
def getMessage(future: Future[Message]): Future[Either[Failure, Success]] =
future
.map(msg => if (msg.statusCode == 500) throw new RuntimeException("boom") else msg)
.map(_.data)
.map(data => Right(Success(data)))
.recover{case ex => Left(Failure())}
Другой вариант - transform
, например
.
def getMessage(future: Future[Message]): Future[Either[Failure, Success]] = {
future
.map(msg => if (msg.statusCode == 500) throw new RuntimeException("boom") else msg)
.map(_.data)
.transform(v => scala.util.Success {
v.toEither
.map(v => Success(v))
.left.map(e => Failure())
})
}
Внимание, вы определили свои Success/Failure
тени Scala 1012 *.