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("}")
}