fun renderMapMember()

in smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/integration/serde/xml/MemberShapeDecodeXMLGenerator.kt [151:193]


    fun renderMapMember(member: MemberShape, memberTarget: MapShape, containerName: String, memberName: String) {
        val memberTargetValue = ctx.symbolProvider.toSymbol(memberTarget.value)
        val symbolOptional = if (ctx.symbolProvider.toSymbol(memberTarget).isBoxed()) "?" else ""

        val memberNameUnquoted = memberName.removeSurrounding("`", "`")
        var currContainerName = containerName
        var currContainerKey = ".$memberNameUnquoted"
        val memberIsFlattened = member.hasTrait<XmlFlattenedTrait>()
        val keyedBySymbolForContainer = determineSymbolForShapeInMap(memberTarget, ClientRuntimeTypes.Serde.MapEntry, true)
        var containerUsedForDecoding: String
        var ifNilOrIfLetStatement: String
        val nextContainerName = "${memberNameUnquoted}WrappedContainer"
        writer.write("let $nextContainerName = $currContainerName.nestedContainerNonThrowable(keyedBy: $keyedBySymbolForContainer.CodingKeys.self, forKey: $currContainerKey)")
        if (!memberIsFlattened) {
            currContainerKey = ".entry"
            currContainerName = nextContainerName
            containerUsedForDecoding = currContainerName
            ifNilOrIfLetStatement = "if let $currContainerName = $currContainerName {"
        } else {
            // currContainerKey is intentionally not updated. This container is only used to detect empty lists, not for decoding.
            currContainerName = nextContainerName
            containerUsedForDecoding = containerName
            ifNilOrIfLetStatement = "if $currContainerName != nil {"
        }

        writer.openBlock(ifNilOrIfLetStatement, "} else {") {
            val memberBuffer = "${memberNameUnquoted}Buffer"
            val memberContainerName = "${memberNameUnquoted}Container"
            val memberTargetSymbol = "[${SwiftTypes.String}:$memberTargetValue]"

            val symbolToDecodeTo = determineSymbolForShapeInMap(memberTarget, ClientRuntimeTypes.Serde.MapKeyValue, false)
            writer.write("let $memberContainerName = try $containerUsedForDecoding.decodeIfPresent([$symbolToDecodeTo].self, forKey: $currContainerKey)")
            writer.write("var $memberBuffer: ${memberTargetSymbol}$symbolOptional = nil")
            writer.openBlock("if let $memberContainerName = $memberContainerName {", "}") {
                writer.write("$memberBuffer = $memberTargetSymbol()")
                renderMapMemberItems(memberTarget.value, memberContainerName, memberBuffer)
            }
            renderAssigningDecodedMember(memberName, memberBuffer)
        }
        writer.indent()
        renderAssigningSymbol(memberName, "[:]")
        writer.dedent().write("}")
    }