9

I have a case class on which every field is optional, like:

case class Foo(name: Option[String],
               phone: Option[String],
               email: Option[String])

I was trying to create a manual Decoder for my case class and found that a decoder is something like:

implicit val decoder: Decoder[Foo] = (c: HCursor) => {
  for {
    name <- c.downField("name").as[String]
    phone <- c.downField("phone").as[String]
    email <- c.downField("email").as[String]
  } yield {
    new Foo(name, phone, email)
  }
}

But checking downField method, if the field is not set, the cursor will chage to FailedCursor, so an error will rise.

How can I expect some field to be optional and return None if it is not defined?

Camilo Sampedro
  • 1,306
  • 1
  • 19
  • 32

1 Answers1

23

Just use c.downField.as[Option[T]], so your code will be like this:

implicit val decoder: Decoder[Foo] = (c: HCursor) => {
  for {
    name <- c.downField("name").as[Option[String]]
    phone <- c.downField("phone").as[Option[String]]
    email <- c.downField("email").as[Option[String]]
  } yield new Foo(name, phone, email)
}
Yevhenii Popadiuk
  • 1,024
  • 7
  • 18