Skip to content

Cannot override reader builder of Option field #299

@anton0xf

Description

@anton0xf

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))

Playground

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))

Playground

Is it a bug or my misunderstanding?

I tested it on 0.28.3 and some older versions

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions