in codegen/smithy-aws-kotlin-codegen/src/main/kotlin/aws/sdk/kotlin/codegen/protocols/AwsQuery.kt [43:84]
override fun getSerializerDescriptorGenerator(
ctx: ProtocolGenerator.GenerationContext,
shape: Shape,
members: List<MemberShape>,
writer: KotlinWriter,
): AbstractSerdeDescriptorGenerator =
AwsQuerySerdeFormUrlDescriptorGenerator(ctx.toRenderingContext(this, shape, writer), members)
/**
* Unwraps the response body as specified by
* https://awslabs.github.io/smithy/1.0/spec/aws/aws-query-protocol.html#response-serialization so that the
* deserializer is in the correct state.
*/
override fun unwrapOperationResponseBody(
operationName: String,
writer: KotlinWriter
) {
writer
.addImport(
RuntimeTypes.Serde.SdkFieldDescriptor,
RuntimeTypes.Serde.SerdeXml.XmlSerialName,
RuntimeTypes.Serde.SdkObjectDescriptor,
RuntimeTypes.Serde.deserializeStruct
)
.write("")
.write("val resultDescriptor = #T(SerialKind.Struct, #T(#S))", RuntimeTypes.Serde.SdkFieldDescriptor, RuntimeTypes.Serde.SerdeXml.XmlSerialName, "${operationName}Result")
.openBlock("val wrapperDescriptor = #T.build {", "}", RuntimeTypes.Serde.SdkObjectDescriptor) {
writer
.addImport(RuntimeTypes.Serde.field)
.write("trait(#T(#S))", RuntimeTypes.Serde.SerdeXml.XmlSerialName, "${operationName}Response")
.write("#T(resultDescriptor)", RuntimeTypes.Serde.field)
}
.write("")
// abandon the iterator, this only occurs at the top level operational output
.write("val wrapper = deserializer.#T(wrapperDescriptor)", RuntimeTypes.Serde.deserializeStruct)
.openBlock("if (wrapper.findNextFieldIndex() != resultDescriptor.index) {", "}") {
writer
.addImport(RuntimeTypes.Serde.DeserializationException)
.write("throw #T(#S)", RuntimeTypes.Serde.DeserializationException, "failed to unwrap $operationName response")
}
writer.write("")
}