2016-07-15 58 views
0

我擁有的示例正在驗證信用卡號碼字符串。驗證是1)髮卡人應該存在信用卡號碼,2)髮卡人應該是商戶接受的。如何使用另一個讀取的中間結果讀取

這是迄今爲止我所做的工作。理想情況下,我想在下面的閱讀中使用第一次讀取的中間結果Issuer。有沒有更好的辦法?

回答

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 

附:這是一個網關案例,開始使用scalaz Validation

+0

謝謝。我認爲Reads.apply也可以工作,並沒有在JsError和ValidationResult之間建立連接。防爆。讀取{jsValue => jsValue.validate [字符串]匹配{ 情況JsSuccess(cardNumber,_)=> VAL optIssuer = inferIssuer(cardNumber) optIssuer匹配{ 一些情況下(發行人)=> //檢查是否發行者被商家接受 ??? 情況下無=> JsError( 「無效發行人」) } 情況下錯誤:JsError => ERR } } – ferk86

+0

@ ferk86'issuer'正在另一函數作用域和不處於第二功能訪問,所以你需要一些意大利麪條解決方案 - 希望有人在這裏提供。 – ipoteka