我的例子是验证信用卡号码字符串。验证是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
}
答案 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
的网关案例。