Да, это именно тот случай использования, который replay
предназначен для поддержки:
import io.circe.{CursorOp, Decoder, DecodingFailure}
import io.circe.generic.auto._
import io.circe.jawn.parse
import java.util.UUID
case class TestDecode(test: Test)
case class Test(uuidKey: Option[UUID])
val Right(doc) = parse("""{"test": {"uuidKey": "invalid"}}""")
val Left(DecodingFailure(_, ops)) = Decoder[TestDecode].decodeJson(doc)
doc.hcursor.replay(ops).focus
// res0: Option[io.circe.Json] = Some("invalid")
Это метод на ACursor
, который берет список операций и применяет их к курсору. (в обратном порядке, поскольку операции обычно собираются в виде стека, но в этом случае мы хотим использовать FIFO).
Обратите внимание, что focus
- это Option
, потому что библиотека не имеет никакого состояния c гарантирует, что вы применяете этот список операций к тому же значению JSON, которое вы изначально пытались декодировать, поэтому он может потерпеть неудачу.