in smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/integration/serde/json/MemberShapeDecodeGenerator.kt [121:167]
fun renderDecodeListMember(
shape: CollectionShape,
memberName: String,
containerName: String,
topLevelMember: MemberShape,
level: Int = 0
) {
val isSparse = ctx.model.expectShape(topLevelMember.target).hasTrait<SparseTrait>()
val symbolName = determineSymbolForShape(shape, true)
val originalSymbol = ctx.symbolProvider.toSymbol(shape)
val decodedMemberName = "${memberName.removeSurroundingBackticks()}Decoded$level"
var insertMethod = when (shape) {
is SetShape -> "insert"
is ListShape -> "append"
else -> "append"
}
val nestedTarget = ctx.model.expectShape(shape.member.target)
if (level == 0) {
insertMethod = when (ctx.model.expectShape(topLevelMember.target)) {
is SetShape -> "insert"
is ListShape -> "append"
else -> "append"
}
val listContainerName = "${memberName}Container"
val decodeVerb = if (originalSymbol.isBoxed()) "decodeIfPresent" else "decode"
writer.write(
"let \$L = try $containerName.$decodeVerb(\$L.self, forKey: .\$L)",
listContainerName,
symbolName,
memberName
)
writer.write("var \$L:\$T = nil", decodedMemberName, originalSymbol)
writer.openBlock("if let \$L = \$L {", "}", listContainerName, listContainerName) {
writer.write("\$L = \$N()", decodedMemberName, originalSymbol)
renderDecodeListTarget(nestedTarget, decodedMemberName, listContainerName, insertMethod, topLevelMember, shape.isSetShape, level)
}
renderAssigningDecodedMember(topLevelMember, decodedMemberName)
} else {
writer.openBlock("if let \$L = \$L {", "}", memberName, memberName) {
val previousDecodedMemberName = "${memberName.removeSurroundingBackticks()}Decoded${level - 1}"
val symbolName = determineSymbolForShape(shape, isSparse)
writer.write("\$L = \$L()", previousDecodedMemberName, symbolName)
renderDecodeListTarget(nestedTarget, containerName, memberName, insertMethod, topLevelMember, shape.isSetShape, level)
}
}
}