in codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/protocols/serialize/JsonSerializerGenerator.kt [92:159]
fun structMember(
context: StructContext,
member: MemberShape,
symProvider: RustSymbolProvider,
jsonName: (MemberShape) -> String,
): MemberContext =
MemberContext(
objectValueWriterExpression(context.objectName, jsonName(member)),
ValueExpression.Value("${context.localName}.${symProvider.toMemberName(member)}"),
member
)
fun unionMember(
context: Context<UnionShape>,
variantReference: String,
member: MemberShape,
jsonName: (MemberShape) -> String,
): MemberContext =
MemberContext(
objectValueWriterExpression(context.writerExpression, jsonName(member)),
ValueExpression.Reference(variantReference),
member
)
/** Returns an expression to get a JsonValueWriter from a JsonObjectWriter */
private fun objectValueWriterExpression(objectWriterName: String, jsonName: String): String =
"$objectWriterName.key(${jsonName.dq()})"
}
}
// Specialized since it holds a JsonObjectWriter expression rather than a JsonValueWriter
private data class StructContext(
/** Name of the JsonObjectWriter */
val objectName: String,
/** Name of the variable that holds the struct */
val localName: String,
val shape: StructureShape,
)
private val model = codegenContext.model
private val symbolProvider = codegenContext.symbolProvider
private val mode = codegenContext.mode
private val runtimeConfig = codegenContext.runtimeConfig
private val smithyTypes = CargoDependency.SmithyTypes(runtimeConfig).asType()
private val smithyJson = CargoDependency.smithyJson(runtimeConfig).asType()
private val codegenScope = arrayOf(
"String" to RuntimeType.String,
"Error" to runtimeConfig.serializationError(),
"SdkBody" to RuntimeType.sdkBody(runtimeConfig),
"JsonObjectWriter" to smithyJson.member("serialize::JsonObjectWriter"),
"JsonValueWriter" to smithyJson.member("serialize::JsonValueWriter"),
)
private val serializerUtil = SerializerUtil(model)
private val operationSerModule = RustModule.private("operation_ser")
private val jsonSerModule = RustModule.private("json_ser")
/**
* Reusable structure serializer implementation that can be used to generate serializing code for
* operation, error and structure shapes.
* We still generate the serializer symbol even if there are no included members because the server
* generation requires serializers for all output/error structures.
*/
private fun structureSerializer(
fnName: String,
structureShape: StructureShape,
includedMembers: List<MemberShape>
): RuntimeType {
return RuntimeType.forInlineFun(fnName, operationSerModule) {