Unverified Commit ad119f6e authored by Fahad Zubair's avatar Fahad Zubair Committed by GitHub
Browse files

Use `std::result::Result` instead of `Result` (#4010)



When the model contains a shape by the name of `Result`, the generated
code fails to compile. For instance the following model fails:

```smithy
@restJson1
service ConstrainedService {
    operations: [SampleOperation]
}

@http(uri: "/anOperation", method: "POST")
operation SampleOperation {
    output: SampleInputOutput
    input: SampleInputOutput
    errors: [ValidationException]
}

structure SampleInputOutput {
    result: Result
}

structure Result {
    @pattern("^a-z$")
    chat: String
}
```

This PR ensures:

1. If `rustTemplate` is being used, then `#{Result}` is used
2. If `rust` is being used, then that is changed to `rustTemplate` and
then `#{Result}` is used.
3. If `rustBlock` is being used, then the generated code should use
`std::result::Result`

---------

Co-authored-by: default avatarFahad Zubair <fahadzub@amazon.com>
Co-authored-by: default avatarAWS SDK Rust Bot <aws-sdk-rust-primary@amazon.com>
Co-authored-by: default avatarRussell Cohen <rcoh@amazon.com>
Co-authored-by: default avatardavid-perez <d@vidp.dev>
Co-authored-by: default avatarLandon James <lnj@amazon.com>
parent 891a82ba
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -15,6 +15,7 @@ import software.amazon.smithy.rust.codegen.core.rustlang.Visibility
import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate
import software.amazon.smithy.rust.codegen.core.rustlang.toType
import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType
import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.std
import software.amazon.smithy.rust.codegen.core.smithy.RustCrate
import software.amazon.smithy.rust.codegen.core.smithy.customize.AdHocCustomization
import software.amazon.smithy.rust.codegen.core.smithy.customize.adhocCustomization
@@ -60,7 +61,7 @@ class TimestreamDecorator : ClientCodegenDecorator {
            // helper function to resolve an endpoint given a base client
            rustTemplate(
                """
                async fn resolve_endpoint(client: &crate::Client) -> Result<(#{Endpoint}, #{SystemTime}), #{BoxError}> {
                async fn resolve_endpoint(client: &crate::Client) -> #{Result}<(#{Endpoint}, #{SystemTime}), #{BoxError}> {
                    let describe_endpoints =
                        client.describe_endpoints().send().await?;
                    let endpoint = describe_endpoints.endpoints().first().unwrap();
+2 −1
Original line number Diff line number Diff line
@@ -140,6 +140,7 @@ internal class EndpointResolverGenerator(
            "EndpointError" to types.resolveEndpointError,
            "ServiceSpecificEndpointResolver" to codegenContext.serviceSpecificEndpointResolver(),
            "DiagnosticCollector" to EndpointsLib.DiagnosticCollector,
            *preludeScope,
        )

    private val allowLintsForResolver =
@@ -195,7 +196,7 @@ internal class EndpointResolverGenerator(
                        Self { #{custom_fields_init:W} }
                    }

                    fn resolve_endpoint(&self, params: &#{Params}) -> Result<#{SmithyEndpoint}, #{BoxError}> {
                    fn resolve_endpoint(&self, params: &#{Params}) -> #{Result}<#{SmithyEndpoint}, #{BoxError}> {
                        let mut diagnostic_collector = #{DiagnosticCollector}::new();
                        Ok(#{resolver_fn}(params, &mut diagnostic_collector, #{additional_args})
                            .map_err(|err|err.with_source(diagnostic_collector.take_last_error()))?)
+1 −1
Original line number Diff line number Diff line
@@ -148,7 +148,7 @@ class FluentClientGenerator(
                        &self.handle.conf
                    }

                    fn validate_config(handle: &Handle) -> Result<(), #{BoxError}> {
                    fn validate_config(handle: &Handle) -> #{Result}<(), #{BoxError}> {
                        let mut cfg = #{ConfigBag}::base();
                        handle.runtime_plugins
                            .apply_client_configuration(&mut cfg)?
+5 −3
Original line number Diff line number Diff line
@@ -103,6 +103,7 @@ class AwsJsonSerializerGenerator(
        arrayOf(
            "Error" to runtimeConfig.serializationError(),
            "SdkBody" to RuntimeType.sdkBody(runtimeConfig),
            *RuntimeType.preludeScope,
        )
    private val protocolFunctions = ProtocolFunctions(codegenContext)

@@ -113,7 +114,7 @@ class AwsJsonSerializerGenerator(
            serializer =
                protocolFunctions.serializeFn(operationShape, fnNameSuffix = "input") { fnName ->
                    rustBlockTemplate(
                        "pub fn $fnName(_input: &#{target}) -> Result<#{SdkBody}, #{Error}>",
                        "pub fn $fnName(_input: &#{target}) -> #{Result}<#{SdkBody}, #{Error}>",
                        *codegenScope, "target" to codegenContext.symbolProvider.toSymbol(inputShape),
                    ) {
                        rustTemplate("""Ok(#{SdkBody}::from("{}"))""", *codegenScope)
@@ -138,6 +139,7 @@ open class AwsJson(
                CargoDependency.smithyJson(runtimeConfig).toType()
                    .resolve("deserialize::error::DeserializeError"),
            "json_errors" to RuntimeType.jsonErrors(runtimeConfig),
            *RuntimeType.preludeScope,
        )

    val version: AwsJsonVersion get() = awsJsonVersion
@@ -164,7 +166,7 @@ open class AwsJson(
        ProtocolFunctions.crossOperationFn("parse_http_error_metadata") { fnName ->
            rustTemplate(
                """
                pub fn $fnName(_response_status: u16, response_headers: &#{Headers}, response_body: &[u8]) -> Result<#{ErrorMetadataBuilder}, #{JsonError}> {
                pub fn $fnName(_response_status: u16, response_headers: &#{Headers}, response_body: &[u8]) -> #{Result}<#{ErrorMetadataBuilder}, #{JsonError}> {
                    #{json_errors}::parse_error_metadata(response_body, response_headers)
                }
                """,
@@ -177,7 +179,7 @@ open class AwsJson(
            // `HeaderMap::new()` doesn't allocate.
            rustTemplate(
                """
                pub fn $fnName(payload: &#{Bytes}) -> Result<#{ErrorMetadataBuilder}, #{JsonError}> {
                pub fn $fnName(payload: &#{Bytes}) -> #{Result}<#{ErrorMetadataBuilder}, #{JsonError}> {
                    #{json_errors}::parse_error_metadata(payload, &#{Headers}::new())
                }
                """,
+3 −2
Original line number Diff line number Diff line
@@ -46,6 +46,7 @@ class AwsQueryProtocol(private val codegenContext: CodegenContext) : Protocol {
            "ErrorMetadataBuilder" to RuntimeType.errorMetadataBuilder(runtimeConfig),
            "Headers" to RuntimeType.headers(runtimeConfig),
            "XmlDecodeError" to RuntimeType.smithyXml(runtimeConfig).resolve("decode::XmlDecodeError"),
            *RuntimeType.preludeScope,
        )

    override val httpBindingResolver: HttpBindingResolver = AwsQueryBindingResolver(codegenContext.model)
@@ -61,7 +62,7 @@ class AwsQueryProtocol(private val codegenContext: CodegenContext) : Protocol {
    override fun parseHttpErrorMetadata(operationShape: OperationShape): RuntimeType =
        ProtocolFunctions.crossOperationFn("parse_http_error_metadata") { fnName ->
            rustBlockTemplate(
                "pub fn $fnName(_response_status: u16, _response_headers: &#{Headers}, response_body: &[u8]) -> Result<#{ErrorMetadataBuilder}, #{XmlDecodeError}>",
                "pub fn $fnName(_response_status: u16, _response_headers: &#{Headers}, response_body: &[u8]) -> #{Result}<#{ErrorMetadataBuilder}, #{XmlDecodeError}>",
                *errorScope,
            ) {
                rust("#T::parse_error_metadata(response_body)", awsQueryErrors)
@@ -71,7 +72,7 @@ class AwsQueryProtocol(private val codegenContext: CodegenContext) : Protocol {
    override fun parseEventStreamErrorMetadata(operationShape: OperationShape): RuntimeType =
        ProtocolFunctions.crossOperationFn("parse_event_stream_error_metadata") { fnName ->
            rustBlockTemplate(
                "pub fn $fnName(payload: &#{Bytes}) -> Result<#{ErrorMetadataBuilder}, #{XmlDecodeError}>",
                "pub fn $fnName(payload: &#{Bytes}) -> #{Result}<#{ErrorMetadataBuilder}, #{XmlDecodeError}>",
                *errorScope,
            ) {
                rust("#T::parse_error_metadata(payload.as_ref())", awsQueryErrors)
Loading