fun renderListMember()

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


    fun renderListMember(memberName: String, containerName: String, member: MemberShape, memberTarget: CollectionShape) {
        val memberIsFlattened = member.hasTrait(XmlFlattenedTrait::class.java)
        var currContainerName = containerName
        var currContainerKey = ".$memberName"
        var containerUsedForDecoding: String
        var ifNilOrIfLetStatement: String
        val nextContainerName = "${memberName}WrappedContainer"
        if (!memberIsFlattened) {
            val memberCodingKey = CollectionMemberCodingKey.construct(memberTarget.member)
            memberCodingKey.renderStructs(writer)
            writer.write("let $nextContainerName = $currContainerName.nestedContainerNonThrowable(keyedBy: CollectionMemberCodingKey<${memberCodingKey.keyTag()}>.CodingKeys.self, forKey: $currContainerKey)")
            currContainerKey = ".member"
            currContainerName = nextContainerName
            containerUsedForDecoding = currContainerName
            ifNilOrIfLetStatement = "if let $currContainerName = $currContainerName {"
        } else {
            writer.write("let $nextContainerName = $currContainerName.nestedContainerNonThrowable(keyedBy: CodingKeys.self, forKey: $currContainerKey)")
            // 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 = "${memberName}Buffer"
            val memberContainerName = "${memberName}Container"
            val (memberTargetSymbol, memberTargetSymbolName) = nestedMemberTargetSymbolMapper(memberTarget)
            writer.write("let $memberContainerName = try $containerUsedForDecoding.decodeIfPresent($memberTargetSymbolName.self, forKey: $currContainerKey)")
            writer.write("var $memberBuffer:\$T = nil", memberTargetSymbol)
            writer.openBlock("if let $memberContainerName = $memberContainerName {", "}") {
                writer.write("$memberBuffer = \$N()", memberTargetSymbol)
                renderListMemberItems(memberTarget, memberContainerName, memberBuffer)
            }
            renderAssigningDecodedMember(memberName, memberBuffer)
        }
        writer.indent()
        renderAssigningSymbol(memberName, "[]")
        writer.dedent().write("}")
    }