circe-generic-extras icon indicating copy to clipboard operation
circe-generic-extras copied to clipboard

match might not be exhaustive

Open ghostbuster91 opened this issue 3 years ago • 0 comments

Hi,

I am not sure whether it is a bug, but for sure it's quite a surprising behavior.

There is an option in the configuration called Configuration.default.withDefaults which allows for the derivation of non-case classes based on the fields they specify.

When combined with the following scalac options:-Xlint:strict-unsealed-patmat and -Wconf:cat=other-match-analysis:error it causes compilation to fail with "match may not be exhaustive" error.

This alone isn't yet that bad, but the error will propagate downstream through the chain of defined derivations and macros making it quite hard to debug for the end-users. I myself got it when I was trying to derive some tapir's type-classes that rely on circe codecs.

Here is a failed build on CI which illustrates that problem: https://github.com/softwaremill/livestub/runs/2586343239

Update: When trying to prepare a minimal example to reproduce I discovered that such a class needs also to specify an unapply method.

The minimal example to reproduce:

import io.circe.generic.extras.Configuration
import io.circe.generic.semiauto._

trait JsonSupport {
  implicit val config: Configuration = Configuration.default.withDefaults

  implicit val headerEncoder = deriveEncoder[Header]
}

class Header(val name: String, val value: String) {}

object Header {
  def unapply(h: Header): Option[(String, String)] = Some((h.name, h.value))

}

Originally reported in https://github.com/circe/circe/issues/1756

ghostbuster91 avatar May 23 '21 11:05 ghostbuster91