diff --git a/hoplite-core/src/main/kotlin/com/sksamuel/hoplite/decoder/LinkedHashMapDecoder.kt b/hoplite-core/src/main/kotlin/com/sksamuel/hoplite/decoder/LinkedHashMapDecoder.kt index a41a38c1..9dd41b77 100644 --- a/hoplite-core/src/main/kotlin/com/sksamuel/hoplite/decoder/LinkedHashMapDecoder.kt +++ b/hoplite-core/src/main/kotlin/com/sksamuel/hoplite/decoder/LinkedHashMapDecoder.kt @@ -1,12 +1,7 @@ package com.sksamuel.hoplite.decoder +import com.sksamuel.hoplite.* import com.sksamuel.hoplite.fp.invalid -import com.sksamuel.hoplite.ConfigFailure -import com.sksamuel.hoplite.ConfigResult -import com.sksamuel.hoplite.DecoderContext -import com.sksamuel.hoplite.MapNode -import com.sksamuel.hoplite.Node -import com.sksamuel.hoplite.StringNode import com.sksamuel.hoplite.fp.flatMap import com.sksamuel.hoplite.fp.sequence import kotlin.reflect.KType @@ -33,7 +28,7 @@ class LinkedHashMapDecoder : NullHandlingDecoder> { vdecoder: Decoder, context: DecoderContext): ConfigResult> { - return node.map.entries.map { (k, v) -> + return node.denormalize().map.entries.map { (k, v) -> kdecoder.decode(StringNode(k, node.pos, node.path, emptyMap()), kType, context).flatMap { kk -> vdecoder.decode(v, vType, context).map { vv -> kk to vv diff --git a/hoplite-yaml/src/test/kotlin/com/sksamuel/hoplite/yaml/DenormalizedLinkedHashMapKeysTest.kt b/hoplite-yaml/src/test/kotlin/com/sksamuel/hoplite/yaml/DenormalizedLinkedHashMapKeysTest.kt new file mode 100644 index 00000000..2611b7ac --- /dev/null +++ b/hoplite-yaml/src/test/kotlin/com/sksamuel/hoplite/yaml/DenormalizedLinkedHashMapKeysTest.kt @@ -0,0 +1,30 @@ +package com.sksamuel.hoplite.yaml + +import com.sksamuel.hoplite.ConfigLoaderBuilder +import com.sksamuel.hoplite.addResourceOrFileSource +import io.kotest.core.spec.style.FunSpec +import io.kotest.matchers.shouldBe + +class DenormalizedLinkedHashMapKeysTest : FunSpec({ + data class Foo( + val xVal: String = "x" + ) + + data class LinkedHashMapContainer( + val m: LinkedHashMap = linkedMapOf() + ) + + test("should set denormalized map keys and decode a data class inside a linked has map map") { + val config = ConfigLoaderBuilder.default() + .addResourceOrFileSource("/test_data_class_in_map.yaml") + .build() + .loadConfigOrThrow() + + config shouldBe LinkedHashMapContainer( + m = linkedMapOf( + "DC1" to Foo("10"), + "DC2" to Foo("20"), + ) + ) + } +})