Skip to content

Commit

Permalink
Fix derivation incompatibility after #1239 (#1282)
Browse files Browse the repository at this point in the history
  • Loading branch information
plokhotnyuk authored Feb 3, 2025
1 parent 001cb09 commit d7969a7
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 5 deletions.
3 changes: 1 addition & 2 deletions zio-json/shared/src/main/scala-2.x/zio/json/macros.scala
Original file line number Diff line number Diff line change
Expand Up @@ -297,10 +297,9 @@ object DeriveJsonDecoder {

@tailrec
private[this] def allowMissingValueDecoder(d: JsonDecoder[_]): Boolean = d match {
case _: OptionJsonDecoder[_] => true
case _: CollectionJsonDecoder[_] => !explicitEmptyCollections
case d: MappedJsonDecoder[_] => allowMissingValueDecoder(d.underlying)
case _ => false
case _ => true
}

override def unsafeDecodeMissing(trace: List[JsonError]): A = {
Expand Down
3 changes: 1 addition & 2 deletions zio-json/shared/src/main/scala-3/zio/json/macros.scala
Original file line number Diff line number Diff line change
Expand Up @@ -313,10 +313,9 @@ sealed class JsonDecoderDerivation(config: JsonCodecConfiguration) extends Deriv

@tailrec
private[this] def allowMissingValueDecoder(d: JsonDecoder[_]): Boolean = d match {
case _: OptionJsonDecoder[_] => true
case _: CollectionJsonDecoder[_] => !explicitEmptyCollections
case d: MappedJsonDecoder[_] => allowMissingValueDecoder(d.underlying)
case _ => false
case _ => true
}

override def unsafeDecodeMissing(trace: List[JsonError]): A = {
Expand Down
16 changes: 15 additions & 1 deletion zio-json/shared/src/test/scala/zio/json/DecoderSpec.scala
Original file line number Diff line number Diff line change
Expand Up @@ -504,6 +504,21 @@ object DecoderSpec extends ZIOSpecDefault {
assertTrue(
json.fromJson[(Foo, Bar)] == Right((Foo(1), Bar("foo")))
)
},
test("option custom codec") {
val json = """{"keyStatus": "certified"}"""
final case class Foo(v: String)
final case class RudderSettings(keyStatus: String, policyMode: Option[Foo])
implicit val encoderOptionPolicyMode: JsonEncoder[Option[Foo]] = JsonEncoder.string.contramap {
case None => "default"
case Some(f) => f.v
}
implicit val decoderOptionPolicyMode: JsonDecoder[Option[Foo]] = JsonDecoder[Option[String]].mapOrFail {
case None | Some("default") => Right(None)
case Some(s) => Right(Some(Foo(s)))
}
implicit lazy val codecRudderSettings: JsonCodec[RudderSettings] = DeriveJsonCodec.gen
assertTrue(json.fromJson[RudderSettings] == Right(RudderSettings("certified", None)))
}
),
suite("fromJsonAST")(
Expand Down Expand Up @@ -843,5 +858,4 @@ object DecoderSpec extends ZIOSpecDefault {
implicit val eventDecoder: JsonDecoder[Event] = DeriveJsonDecoder.gen[Event]
implicit val eventEncoder: JsonEncoder[Event] = DeriveJsonEncoder.gen[Event]
}

}

0 comments on commit d7969a7

Please sign in to comment.