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