如何使用Reads的中间结果与另一个读取

时间:2016-07-15 18:32:38

标签: recycle-bin

我的例子是验证信用卡号码字符串。验证是1)发卡人应该存在信用卡号,2)发卡人应该是商家接受的。

到目前为止我的工作。理想情况下,我想在下一次读取时使用第一次读取的中间结果Issuer。还有更好的方法吗?

   Reads.filter[String](ValidationError("Invalid Issuer")) { cardNumber =>
      findIssuer(cardNumber).isDefined // Option[Issuer]
    } andThen
    Reads.filter[String](ValidationError("Issuer not accepted")) { cardNumber =>
// get issuer, then check issuer is accepted by merchant
    }

1 个答案:

答案 0 :(得分:1)

这不是一个直接的答案,但您可以考虑将此逻辑写为for/yield表达式:

val result: Either[String, Issuer] = for {
  card <- json.validate[Card].asEither.leftMap(_ => "Reading error")
  issuer <- findIssuer(card.number) //returns Either[String, _]
  _ <- isAccepted(issuer) // returns Either[String,_]
} yield issuer

P.S。这是开始使用scalaz Validation的网关案例。