tethys
tethys copied to clipboard
Cannot override reader builder of Option field
I can read field value from one of two JSON-fields with code like this (and it works well):
import tethys._
import tethys.jackson._
import tethys.derivation.builder._
import tethys.derivation.semiauto._
case class Foo(a: Int)
implicit val fooReader: JsonReader[Foo] = jsonReader[Foo] {
ReaderBuilder[Foo]
.extract(_.a)
.from("a".as[Option[Int]], "b".as[Option[Int]])((a, b) =>
a.orElse(b)
.getOrElse(throw new RuntimeException("cannot find 'a' or 'b'"))
)
}
println("""{"b": 2}""".jsonAs[Foo])
// => Right(Foo(2))
But the same approach doesn't work if a is Option:
// same imports
case class Foo(a: Option[Int])
implicit val fooReader: JsonReader[Foo] = jsonReader[Foo] {
ReaderBuilder[Foo]
.extract(_.a)
.from("a".as[Option[Int]], "b".as[Option[Int]])((a, b) => a.orElse(b))
}
println("""{"b": 2}""".jsonAs[Foo])
// => Right(Foo(None))
// but expected
// => Right(Foo(2))
Is it a bug or my misunderstanding?
I tested it on 0.28.3 and some older versions
It is even works well if I don't mention "a" fielld:
case class Foo(a: Option[Int])
implicit val fooReader: JsonReader[Foo] = jsonReader[Foo] {
ReaderBuilder[Foo]
.extract(_.a)
.from("c".as[Option[Int]], "b".as[Option[Int]])((c, b) => c.orElse(b))
}
println("""{"b": 2}""".jsonAs[Foo]) // => Right(Foo(Some(2)))
println("""{"c": 2}""".jsonAs[Foo]) // => Right(Foo(Some(2)))
Thanks for reporting! That's indeed looks like a bug
Considering fix only for scala 3