From 25c7974f8e2d9f94a6ab0278e5cf789f4571b3f4 Mon Sep 17 00:00:00 2001 From: sksamuel Date: Sun, 28 Apr 2024 12:33:31 -0500 Subject: [PATCH] Added useStrictPrimitiveDecoders --- .../centurion/avro/decoders/Decoder.kt | 13 +++++++----- .../centurion/avro/decoders/primitives.kt | 20 +++++++++++++++++++ 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/centurion-avro/src/main/kotlin/com/sksamuel/centurion/avro/decoders/Decoder.kt b/centurion-avro/src/main/kotlin/com/sksamuel/centurion/avro/decoders/Decoder.kt index 01f305a..2d6cc10 100644 --- a/centurion-avro/src/main/kotlin/com/sksamuel/centurion/avro/decoders/Decoder.kt +++ b/centurion-avro/src/main/kotlin/com/sksamuel/centurion/avro/decoders/Decoder.kt @@ -27,14 +27,17 @@ fun interface Decoder { } companion object { + + var useStrictPrimitiveDecoders = true + fun decoderFor(type: KType): Decoder<*> { val decoder: Decoder<*> = when (val classifier = type.classifier) { String::class -> StringDecoder - Boolean::class -> BooleanDecoder - Float::class -> FloatDecoder - Double::class -> DoubleDecoder - Int::class -> IntDecoder - Long::class -> LongDecoder + Boolean::class -> if (useStrictPrimitiveDecoders) StrictBooleanDecoder else BooleanDecoder + Float::class -> if (useStrictPrimitiveDecoders) StrictFloatDecoder else FloatDecoder + Double::class -> if (useStrictPrimitiveDecoders) StrictDoubleDecoder else DoubleDecoder + Int::class -> if (useStrictPrimitiveDecoders) StrictIntDecoder else IntDecoder + Long::class -> if (useStrictPrimitiveDecoders) StrictLongDecoder else LongDecoder List::class -> ListDecoder(decoderFor(type.arguments.first().type!!)) Set::class -> SetDecoder(decoderFor(type.arguments.first().type!!)) Map::class -> MapDecoder(decoderFor(type.arguments[1].type!!)) diff --git a/centurion-avro/src/main/kotlin/com/sksamuel/centurion/avro/decoders/primitives.kt b/centurion-avro/src/main/kotlin/com/sksamuel/centurion/avro/decoders/primitives.kt index c7c0240..e076c27 100644 --- a/centurion-avro/src/main/kotlin/com/sksamuel/centurion/avro/decoders/primitives.kt +++ b/centurion-avro/src/main/kotlin/com/sksamuel/centurion/avro/decoders/primitives.kt @@ -41,6 +41,10 @@ object IntDecoder : Decoder { } } +object StrictLongDecoder : Decoder { + override fun decode(schema: Schema): (Any?) -> Long = { it as Long } +} + object LongDecoder : Decoder { override fun decode(schema: Schema): (Any?) -> Long { require(schema.type == Schema.Type.LONG) @@ -56,6 +60,10 @@ object LongDecoder : Decoder { } } +object StrictIntDecoder : Decoder { + override fun decode(schema: Schema): (Any?) -> Int = { it as Int } +} + object DoubleDecoder : Decoder { override fun decode(schema: Schema): (Any?) -> Double { require(schema.type == Schema.Type.DOUBLE) @@ -69,6 +77,10 @@ object DoubleDecoder : Decoder { } } +object StrictDoubleDecoder : Decoder { + override fun decode(schema: Schema): (Any?) -> Double = { it as Double } +} + object FloatDecoder : Decoder { override fun decode(schema: Schema): (Any?) -> Float { require(schema.type == Schema.Type.FLOAT) @@ -81,6 +93,10 @@ object FloatDecoder : Decoder { } } +object StrictFloatDecoder : Decoder { + override fun decode(schema: Schema): (Any?) -> Float = { it as Float } +} + object BooleanDecoder : Decoder { override fun decode(schema: Schema): (Any?) -> Boolean { require(schema.type == Schema.Type.BOOLEAN) @@ -92,3 +108,7 @@ object BooleanDecoder : Decoder { } } } + +object StrictBooleanDecoder : Decoder { + override fun decode(schema: Schema): (Any?) -> Boolean = { it as Boolean } +}