I need to create an updated instance from a case class instance (with any needed DecodeJson
s implicitly derived), given an incomplete json (some fields missing). Ho
You can generate those implicit val defs / pd
with macro annotation on Person
(in object Person
, for example, and do import Person._
to summon implicits). See this unfinished Simulacrum in scalameta (scala-reflect is fine too, but seems like scalameta can be enough here) for usage examples. Also you have to specify missing default value (42
) somewhere, for example, in case class constructor (age: Int = 42
, recognition can be done in macro too).
For the sake of completeness: support for "patching" instances like this has been provided in circe since the 0.2 release:
import io.circe.jawn.decode, io.circe.generic.auto._
case class Person(name: String, age: Int)
val person = Person("mr complete", 42)
val incompletePersonJson = """{"name":"mr updated"}"""
val update = decode[Person => Person](incompletePersonJson)
And then:
scala> println(update.map(_(person)))
Right(Person(mr updated,42))
My original blog post about this technique uses Argonaut (mostly since I wrote it a couple of months before I started working on circe), and that implementation is available as a library, although I've never published it anywhere.