2016-07-15 4 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 

P.S. Это шлюз, чтобы начать использовать scalaz Validation.

+0

Спасибо. Я думаю, что Reads.apply также будет работать и не установит связь между JsError и ValidationResult. Ex. Читает {jsValue => jsValue.validate [String] матч { случай JsSuccess (cardNumber, _) => вал optIssuer = inferIssuer (cardNumber) optIssuer матч { случай Некоторые (эмитент) => // проверить, если эмитент принимается торговцем ??? случай None => JsError ("Invalid Эмитент") } случай ERR: JsError => эээ }} – ferk86

+0

@ ferk86 'issuer' под другой областью видимости функции и не доступны во второй функции, так что вы нужно некоторое решение спагетти - надеюсь, что кто-то предоставит его здесь. – ipoteka