in smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/integration/serde/json/MemberShapeEncodeGenerator.kt [75:122]
fun renderEncodeListMember(
targetShape: Shape,
memberName: String,
containerName: String,
level: Int = 0
) {
when (targetShape) {
is CollectionShape -> {
val topLevelContainerName = "${memberName.removeSurroundingBackticks()}Container"
if (level == 0) {
writer.write(
"var \$L = $containerName.nestedUnkeyedContainer(forKey: .\$L)",
topLevelContainerName,
memberName
)
renderEncodeList(ctx, memberName, topLevelContainerName, targetShape, level)
} else {
writer.write("var \$L = $containerName.nestedUnkeyedContainer()", topLevelContainerName)
val isSparse = targetShape.hasTrait<SparseTrait>()
if (isSparse) {
writer.openBlock("if let \$L = \$L {", "}", memberName, memberName) {
renderEncodeList(ctx, memberName, topLevelContainerName, targetShape, level)
}
} else {
renderEncodeList(ctx, memberName, topLevelContainerName, targetShape, level)
}
}
}
// this only gets called in a recursive loop where there is a map nested deeply inside a list
is MapShape -> {
val topLevelContainerName = "${memberName}Container"
writer.write("var \$L = $containerName.nestedContainer(keyedBy: \$N.self)", topLevelContainerName, ClientRuntimeTypes.Serde.Key)
val isSparse = targetShape.hasTrait<SparseTrait>()
if (isSparse) {
writer.openBlock("if let \$L = \$L {", "}", memberName, memberName) {
renderEncodeMap(ctx, memberName, topLevelContainerName, targetShape, level)
}
} else {
renderEncodeMap(ctx, memberName, topLevelContainerName, targetShape, level)
}
}
else -> {
val extension = getShapeExtension(targetShape, memberName, false)
writer.write("try $containerName.encode($extension)")
}
}
}