fun renderDecodeListMember()

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