diff --git a/centurion-avro/src/main/kotlin/com/sksamuel/centurion/avro/encoders/records.kt b/centurion-avro/src/main/kotlin/com/sksamuel/centurion/avro/encoders/records.kt index f116680..4bc108e 100644 --- a/centurion-avro/src/main/kotlin/com/sksamuel/centurion/avro/encoders/records.kt +++ b/centurion-avro/src/main/kotlin/com/sksamuel/centurion/avro/encoders/records.kt @@ -21,7 +21,7 @@ class ReflectionRecordEncoder : Encoder { val record = GenericData.Record(schema) value::class.declaredMemberProperties.map { member: KProperty1 -> - 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 val v = member.getter.call(value) val encoded = encoder.encode(field.schema(), v) diff --git a/centurion-avro/src/test/kotlin/com/sksamuel/centurion/avro/encoders/ReflectionRecordEncoderTest.kt b/centurion-avro/src/test/kotlin/com/sksamuel/centurion/avro/encoders/ReflectionRecordEncoderTest.kt index 13b1ec0..682e2af 100644 --- a/centurion-avro/src/test/kotlin/com/sksamuel/centurion/avro/encoders/ReflectionRecordEncoderTest.kt +++ b/centurion-avro/src/test/kotlin/com/sksamuel/centurion/avro/encoders/ReflectionRecordEncoderTest.kt @@ -39,33 +39,57 @@ class ReflectionRecordEncoderTest : FunSpec({ } test("sets") { - data class Foo(val set1: Set, val set2: Set) + data class Foo(val set1: Set, val set2: Set, val set3: Set) + 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, val list2: List) + data class Foo(val list1: List, val list2: List, val list3: List) + 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 } })