in codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/generators/protocol/ProtocolGenerator.kt [120:194]
fun renderOperation(
operationWriter: RustWriter,
inputWriter: RustWriter,
operationShape: OperationShape,
customizations: List<OperationCustomization>
) {
val inputShape = operationShape.inputShape(model)
val builderGenerator = BuilderGenerator(model, symbolProvider, operationShape.inputShape(model))
builderGenerator.render(inputWriter)
// generate type aliases for the fluent builders
renderTypeAliases(inputWriter, operationShape, customizations, inputShape)
// impl OperationInputShape { ... }
val operationName = symbolProvider.toSymbol(operationShape).name
inputWriter.implBlock(inputShape, symbolProvider) {
writeCustomizations(
customizations,
OperationSection.InputImpl(customizations, operationShape, inputShape, protocol)
)
makeOperationGenerator.generateMakeOperation(this, operationShape, customizations)
rustBlockTemplate(
"fn assemble(builder: #{RequestBuilder}, body: #{SdkBody}) -> #{Request}<#{SdkBody}>",
*codegenScope
) {
if (needsContentLength(operationShape)) {
rustTemplate(
"""
let mut builder = builder;
if let Some(content_length) = body.content_length() {
builder = #{header_util}::set_request_header_if_absent(
builder,
#{http}::header::CONTENT_LENGTH,
content_length
);
}
""",
*codegenScope
)
}
rust("""builder.body(body).expect("should be valid request")""")
}
// pub fn builder() -> ... { }
builderGenerator.renderConvenienceMethod(this)
}
// pub struct Operation { ... }
val fluentBuilderName = FluentClientGenerator.clientOperationFnName(operationShape, symbolProvider)
operationWriter.rust(
"""
/// Operation shape for `$operationName`.
///
/// This is usually constructed for you using the the fluent builder returned by
/// [`$fluentBuilderName`](${docLink("crate::client::Client::$fluentBuilderName")}).
///
/// See [`crate::client::fluent_builders::$operationName`] for more details about the operation.
"""
)
Attribute.Derives(setOf(RuntimeType.Clone, RuntimeType.Default, RuntimeType.Debug)).render(operationWriter)
operationWriter.rustBlock("pub struct $operationName") {
write("_private: ()")
}
operationWriter.implBlock(operationShape, symbolProvider) {
builderGenerator.renderConvenienceMethod(this)
rust("/// Creates a new `$operationName` operation.")
rustBlock("pub fn new() -> Self") {
rust("Self { _private: () }")
}
writeCustomizations(customizations, OperationSection.OperationImplBlock(customizations))
}
traitGenerator.generateTraitImpls(operationWriter, operationShape)
}