Skip to content

Commit

Permalink
Added encoding of sets and lists of enums
Browse files Browse the repository at this point in the history
  • Loading branch information
sksamuel committed Apr 14, 2024
1 parent 32631d6 commit 41fd0cb
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ class ReflectionRecordEncoder : Encoder<Any> {
val record = GenericData.Record(schema)

value::class.declaredMemberProperties.map { member: KProperty1<out Any, *> ->
val field = schema.getField(member.name)
val field = schema.getField(member.name) ?: error("Could not find field ${member.name} in schema")
val encoder = Encoder.encoderFor(member.returnType) as Encoder<Any?>
val v = member.getter.call(value)
val encoded = encoder.encode(field.schema(), v)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,33 +39,57 @@ class ReflectionRecordEncoderTest : FunSpec({
}

test("sets") {
data class Foo(val set1: Set<Int>, val set2: Set<Long?>)
data class Foo(val set1: Set<Int>, val set2: Set<Long?>, val set3: Set<Wine>)

val enum = SchemaBuilder.enumeration("Wine").symbols("Malbec", "Shiraz")
val schema = SchemaBuilder.record("Foo").fields()
.name("set1").type().array().items().intType().noDefault()
.name("set2").type().array().items().type(SchemaBuilder.nullable().longType()).noDefault()
.name("set3").type().array().items().type(enum).noDefault()
.endRecord()

val expected = GenericData.Record(schema)
expected.put("set1", listOf(1, 2))
expected.put("set2", listOf(1L, null, 2L))

ReflectionRecordEncoder().encode(schema, Foo(setOf(1, 2), setOf(1L, null, 2L))) shouldBe expected
expected.put(
"set3",
listOf(
GenericData.get().createEnum("Shiraz", enum),
GenericData.get().createEnum("Malbec", enum),
)
)

ReflectionRecordEncoder().encode(
schema,
Foo(setOf(1, 2), setOf(1L, null, 2L), setOf(Wine.Shiraz, Wine.Malbec))
) shouldBe expected
}

test("list") {
data class Foo(val list1: List<Int>, val list2: List<Long?>)
data class Foo(val list1: List<Int>, val list2: List<Long?>, val list3: List<Wine>)

val enum = SchemaBuilder.enumeration("Wine").symbols("Malbec", "Shiraz")
val schema = SchemaBuilder.record("Foo").fields()
.name("list1").type().array().items().intType().noDefault()
.name("list2").type().array().items().type(SchemaBuilder.nullable().longType()).noDefault()
.name("list3").type().array().items().type(enum).noDefault()
.endRecord()

val expected = GenericData.Record(schema)
expected.put("list1", listOf(1, 2))
expected.put("list2", listOf(1L, null, 2L))

ReflectionRecordEncoder().encode(schema, Foo(listOf(1, 2), listOf(1L, null, 2L))) shouldBe expected
expected.put(
"list3",
listOf(
GenericData.get().createEnum("Shiraz", enum),
GenericData.get().createEnum("Malbec", enum),
)
)

ReflectionRecordEncoder().encode(
schema,
Foo(listOf(1, 2), listOf(1L, null, 2L), listOf(Wine.Shiraz, Wine.Malbec))
) shouldBe expected
}
})

Expand Down

0 comments on commit 41fd0cb

Please sign in to comment.