From 7b58dd76817e44670adc3e5a05821c71a752be0b Mon Sep 17 00:00:00 2001 From: 0marperez Date: Wed, 1 May 2024 14:42:47 -0400 Subject: [PATCH] fix: sparse struct serializer --- .../codegen/rendering/serde/SerializeStructGenerator.kt | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/codegen/smithy-kotlin-codegen/src/main/kotlin/software/amazon/smithy/kotlin/codegen/rendering/serde/SerializeStructGenerator.kt b/codegen/smithy-kotlin-codegen/src/main/kotlin/software/amazon/smithy/kotlin/codegen/rendering/serde/SerializeStructGenerator.kt index 20be3a6b6..87c16b444 100644 --- a/codegen/smithy-kotlin-codegen/src/main/kotlin/software/amazon/smithy/kotlin/codegen/rendering/serde/SerializeStructGenerator.kt +++ b/codegen/smithy-kotlin-codegen/src/main/kotlin/software/amazon/smithy/kotlin/codegen/rendering/serde/SerializeStructGenerator.kt @@ -265,7 +265,7 @@ open class SerializeStructGenerator( ShapeType.MAP -> renderMapElement(rootMemberShape, elementShape as MapShape, nestingLevel, parentMemberName) ShapeType.UNION, ShapeType.STRUCTURE, - -> renderNestedStructureElement(elementShape, nestingLevel, parentMemberName) + -> renderNestedStructureElement(elementShape, nestingLevel, parentMemberName, isSparse) else -> error("Unhandled type ${elementShape.type}") } @@ -280,7 +280,7 @@ open class SerializeStructGenerator( * } * ``` */ - private fun renderNestedStructureElement(structureShape: Shape, nestingLevel: Int, parentMemberName: String) { + private fun renderNestedStructureElement(structureShape: Shape, nestingLevel: Int, parentMemberName: String, isSparse: Boolean,) { val serializerFnName = structureShape.type.primitiveSerializerFunctionName() val serializerTypeName = ctx.symbolProvider.toSymbol(structureShape).documentSerializerName() val elementName = nestingLevel.variableNameFor(NestedIdentifierType.ELEMENT) @@ -288,7 +288,10 @@ open class SerializeStructGenerator( val valueToSerializeName = valueToSerializeName(elementName) writer.withBlock("for ($elementName in $containerName$parentMemberName) {", "}") { - writer.write("$serializerFnName(#T($valueToSerializeName, ::$serializerTypeName))", RuntimeTypes.Serde.asSdkSerializable) + when(isSparse) { + true -> writer.write("if ($elementName != null) $serializerFnName(#T($valueToSerializeName, ::$serializerTypeName)) else serializeNull()", RuntimeTypes.Serde.asSdkSerializable) + false -> writer.write("$serializerFnName(#T($valueToSerializeName, ::$serializerTypeName))", RuntimeTypes.Serde.asSdkSerializable) + } } }