Skip to content

Commit 1500ddb

Browse files
authored
Support Option of sealed trait with 1 subtype (sksamuel#888)
1 parent 0f86a05 commit 1500ddb

4 files changed

Lines changed: 34 additions & 3 deletions

File tree

avro4s-core/src/main/scala/com/sksamuel/avro4s/decoders/magnolia.scala

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ trait MagnoliaDerivedDecoder extends AutoDerivation[Decoder] :
1414

1515
override def split[T](ctx: SealedTrait[Decoder, T]): Decoder[T] =
1616
DatatypeShape.of[T](ctx) match {
17-
case SealedTraitShape.TypeUnion => TypeUnions.decoder(ctx)
17+
case SealedTraitShape.TypeUnion =>
18+
ctx.subtypes match {
19+
case IArray(single) => single.typeclass.asInstanceOf[Decoder[T]]
20+
case multiple => TypeUnions.decoder(ctx)
21+
}
1822
case SealedTraitShape.Enum => SealedTraits.decoder(ctx)
1923
}

avro4s-core/src/main/scala/com/sksamuel/avro4s/encoders/magnolia.scala

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ trait MagnoliaDerivedEncoder extends AutoDerivation[Encoder] :
1212

1313
override def split[T](ctx: SealedTrait[Encoder, T]): Encoder[T] =
1414
DatatypeShape.of[T](ctx) match {
15-
case SealedTraitShape.TypeUnion => TypeUnions.encoder(ctx)
15+
case SealedTraitShape.TypeUnion =>
16+
ctx.subtypes match {
17+
case IArray(single) => single.typeclass.asInstanceOf[Encoder[T]]
18+
case multiple => TypeUnions.encoder(ctx)
19+
}
1620
case SealedTraitShape.Enum => SealedTraits.encoder(ctx)
1721
}

avro4s-core/src/main/scala/com/sksamuel/avro4s/schemas/magnolia.scala

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ trait MagnoliaDerivedSchemas extends AutoDerivation[SchemaFor] :
1717

1818
override def split[T](ctx: SealedTrait[SchemaFor, T]): SchemaFor[T] =
1919
DatatypeShape.of[T](ctx) match {
20-
case SealedTraitShape.TypeUnion => TypeUnions.schema(ctx)
20+
case SealedTraitShape.TypeUnion =>
21+
ctx.subtypes match {
22+
case IArray(single) => single.typeclass.forType[T]
23+
case multiple => TypeUnions.schema(ctx)
24+
}
2125
case SealedTraitShape.Enum => SchemaFor[T](SealedTraits.schema(ctx))
2226
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.sksamuel.avro4s.github
2+
3+
import com.sksamuel.avro4s.{AvroSchema, FromRecord, SchemaFor, ToRecord}
4+
import org.scalatest.funsuite.AnyFunSuite
5+
import org.scalatest.matchers.should.Matchers
6+
7+
class GithubIssue885 extends AnyFunSuite with Matchers {
8+
9+
test("support Option of sealed trait with 1 subtype") {
10+
sealed trait Example
11+
case class A(v: String) extends Example
12+
13+
val value = Some(A("a"))
14+
15+
val schema = AvroSchema[Option[Example]]
16+
val record = ToRecord[Option[Example]](schema).to(value)
17+
FromRecord[Option[Example]](schema).from(record) shouldBe value
18+
}
19+
}

0 commit comments

Comments
 (0)