Skip to content

Commit b0b7062

Browse files
pablfvigoo
andauthored
fixed decoder for enum with discriminator (#610)
Co-authored-by: Daniel Vigovszky <daniel.vigovszky@gmail.com>
1 parent 80172cf commit b0b7062

File tree

2 files changed

+18
-4
lines changed

2 files changed

+18
-4
lines changed

zio-schema-json/shared/src/main/scala/zio/schema/codec/JsonCodec.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -517,7 +517,7 @@ object JsonCodec {
517517
case Schema.Either(left, right, _) => ZJsonDecoder.either(schemaDecoder(left, hasDiscriminator), schemaDecoder(right, hasDiscriminator))
518518
case l @ Schema.Lazy(_) => schemaDecoder(l.schema, hasDiscriminator)
519519
//case Schema.Meta(_, _) => astDecoder
520-
case s @ Schema.CaseClass0(_, _, _) => caseClass0Decoder(s)
520+
case s @ Schema.CaseClass0(_, _, _) => caseClass0Decoder(hasDiscriminator, s)
521521
case s @ Schema.CaseClass1(_, _, _, _) => caseClass1Decoder(hasDiscriminator, s)
522522
case s @ Schema.CaseClass2(_, _, _, _, _) => caseClass2Decoder(hasDiscriminator, s)
523523
case s @ Schema.CaseClass3(_, _, _, _, _, _) => caseClass3Decoder(hasDiscriminator, s)
@@ -833,8 +833,8 @@ object JsonCodec {
833833
private[codec] object ProductDecoder {
834834
import zio.schema.codec.JsonCodec.JsonDecoder.schemaDecoder
835835

836-
private[codec] def caseClass0Decoder[Z](schema: Schema.CaseClass0[Z]): ZJsonDecoder[Z] = { (trace: List[JsonError], in: RetractReader) =>
837-
val _ = Codecs.unitDecoder.unsafeDecode(trace, in)
836+
private[codec] def caseClass0Decoder[Z](hasDiscriminator: Boolean, schema: Schema.CaseClass0[Z]): ZJsonDecoder[Z] = { (trace: List[JsonError], in: RetractReader) =>
837+
if (!hasDiscriminator) Codecs.unitDecoder.unsafeDecode(trace, in)
838838
schema.defaultConstruct()
839839
}
840840

zio-schema-json/shared/src/test/scala-2/zio/schema/codec/JsonCodecSpec.scala

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ object JsonCodecSpec extends ZIOSpecDefault {
243243
charSequenceToByteChunk("""{"oneOf":{"_type":"StringValue2","value":"foo2"}}""")
244244
)
245245
},
246-
test("case class ") {
246+
test("case class") {
247247
assertEncodes(
248248
searchRequestWithTransientFieldSchema,
249249
SearchRequestWithTransientField("foo", 10, 20, "bar"),
@@ -1027,6 +1027,10 @@ object JsonCodecSpec extends ZIOSpecDefault {
10271027
Enumeration2(BooleanValue2(false))
10281028
)
10291029
},
1030+
test("of case classes with discriminator") {
1031+
assertEncodesThenDecodes(Schema[Command], Command.Cash) &>
1032+
assertEncodesThenDecodes(Schema[Command], Command.Buy(100))
1033+
},
10301034
suite("of case objects")(
10311035
test("without annotation")(
10321036
assertEncodesThenDecodes(Schema[Color], Color.Red)
@@ -1496,6 +1500,16 @@ object JsonCodecSpec extends ZIOSpecDefault {
14961500
implicit val schema: Schema[Color] = DeriveSchema.gen[Color]
14971501
}
14981502

1503+
@annotation.discriminatorName("type")
1504+
sealed trait Command
1505+
1506+
object Command {
1507+
case class Buy(credits: Int) extends Command
1508+
case object Cash extends Command
1509+
1510+
implicit val schema: Schema[Command] = DeriveSchema.gen[Command]
1511+
}
1512+
14991513
case object Singleton
15001514
implicit val schemaObject: Schema[Singleton.type] = DeriveSchema.gen[Singleton.type]
15011515

0 commit comments

Comments
 (0)