2016-07-15 17 views
0

Das Beispiel, das ich habe, ist die Validierung einer Kreditkartennummer Zeichenfolge. Die Validierungen sind 1) Emittent sollte für die Kreditkartennummer existieren, und 2) Emittent sollte vom Händler akzeptiert werden.So verwenden Sie das Zwischenergebnis von Lesen mit anderen Lesen

Hier ist die Arbeit, die ich bisher habe. Idealerweise würde ich gerne das Zwischenergebnis Issuer vom ersten Lesevorgang in den nächsten Lesevorgängen verwenden. Gibt es einen besseren Weg?

Antwort

1

Es ist keine direkte Antwort, aber man könnte prüfen, diese Logik als for/yield Ausdruck schreiben:

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. Es ist ein Gateway-Fall, um scalaz Validation zu verwenden.

+0

Danke. Ich denke, dass Reads.apply auch funktioniert und die Verbindung zwischen JsError und ValidationResult nicht hergestellt hat. Ex. Liest {jsValue => jsValue.validate [Zeichenfolge] Spiel { Fall JsSuccess (cardnumber, _) => val optIssuer = inferIssuer (cardnumber) optIssuer Spiel { Fall Einige (Emittent) => // überprüfen, ob Emittenten wird vom Händler akzeptiert ??? Fall None => JsError ("Invalid Emittentin") } Fall err: JsError => err } } – ferk86

+0

@ ferk86 'issuer' ist unter einem anderen Funktionsumfang und ist nicht zugänglich in der zweiten Funktion, so dass Sie brauche ein paar Spaghetti-Lösung - hoffe jemand wird es hier zur Verfügung stellen. – ipoteka