2017-04-02 12 views
2

을 감안할 때 :성공에 대한 기록이있는 디코드?

import argonaut._, Argonaut._ 

case class Person(name: String) 

implicit def decode: DecodeJson[Person] = 
    DecodeJson (c => 
    for { 
     name <- (c --\ "name").as[String] 
    } yield Person(name) 
) 

scala> Parse.decode[Person]("""{"name": "Bob", "foo": "dunno"}""") 
res5: Either[Either[String,(String, argonaut.CursorHistory)],Person] = 
    Right(Person(Bob)) 

어떻게 할 수있는 커서의 역사를 가진 즉 JSON => Person I decode,? 역사상으로, 나는 "foo" : "dunno"이 보지 않았 음을 알고 싶습니다/지나쳤습니다.

답변

1

불행히도 성공 사례로 DecodeResult[T] 개체를 만들면 커서 기록이 삭제됩니다.

class HistoryDecodeResult[A](
    val h: Option[CursorHistory], 
    result: \/[(String, CursorHistory),A] 
) extends DecodeResult[A](result) 

object HistoryDecodeResult{ 
    def apply[A](h: Option[CursorHistory], d: DecodeResult[A]) = new HistoryDecodeResult(h, d.result) 
} 
  • :

    • 사용자 정의 HistoryDecodeResult을 구현 : 나는 (당신에게 개념을 설명하기 위해 단지이다 그루터기) 생각할 수

      유일한 해결책이다 암시 적으로 확장 ACursor 도우미 추가 asH 메서드

    implicit class AHCursor(a: ACursor){ 
        def asH[A](implicit d: DecodeJson[A]): HistoryDecodeResult[A] = { 
        HistoryDecodeResult(a.hcursor.map(_.history), a.as[A](d)) 
        } 
    } 
    
    • 재정 HistoryDecodeResultDecodeResult[T]composition methods 역사를 축적하기 위해 :
    override def map[B](f: A => B): HistoryDecodeResult[B] = 
        HistoryDecodeResult(h, super.map(f)) 
    
    //Accumulate history `h` using `CursorHistory.++` if flat-mapping with another HistoryDecodeResult 
    override def flatMap[B](f: A => DecodeResult[B]): HistoryDecodeResult[B] = ??? 
    
    ... //Go on with other methods 
    
    • 당신의 디코딩 루틴에서 HistoryDecodeResult를 얻기를 (당신이 Parse.decode을 피하기 위해이) 역사를 묻습니다.
0

argonaut cursor documentation에 따르면 디코더 대신 hcursor를 사용할 수 있으므로 디코딩 프로세스를 추적 할 수 있습니다.