Unverified Commit ec45767a authored by ysaito1001's avatar ysaito1001 Committed by GitHub
Browse files

Avoid exposing `Arc`ed `ResolveEndpoint` in public API (#2758)



## Motivation and Context
Hides `Arc<dyn ResolveEndpoint>` from public API.

## Description
This PR replaces the occurrences of `Arc<dyn ResolveEndpoint>` with
`SharedEndpointResolver` to not expose bare `Arc`s in the public API.

## Testing
- [x] Passed tests in CI

## Checklist
<!--- If a checkbox below is not applicable, then please DELETE it
rather than leaving it unchecked -->
- [x] I have updated `CHANGELOG.next.toml` if I made changes to the
smithy-rs codegen or runtime crates

----

_By submitting this pull request, I confirm that you can use, modify,
copy, and redistribute this contribution, under the terms of your
choice._

---------

Co-authored-by: default avatarYuki Saito <awsaito@amazon.com>
parent 5eb09275
Loading
Loading
Loading
Loading
+6 −0
Original line number Original line Diff line number Diff line
@@ -162,3 +162,9 @@ filter_by_operation_id(plugin, |id| id.absolute() != "namespace#name");
author = "82marbag"
author = "82marbag"
references = ["smithy-rs#2678"]
references = ["smithy-rs#2678"]
meta = { "breaking" = true, "tada" = false, "bug" = false }
meta = { "breaking" = true, "tada" = false, "bug" = false }

[[smithy-rs]]
message = "The occurrences of `Arc<dyn ResolveEndpoint>` have now been replaced with `SharedEndpointResolver` in public APIs."
references = ["smithy-rs#2758"]
meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" }
author = "ysaito1001"
+4 −1
Original line number Original line Diff line number Diff line
@@ -45,6 +45,7 @@ class TimestreamDecorator : ClientCodegenDecorator {
            },
            },
        )
        )
    }
    }

    override fun extras(codegenContext: ClientCodegenContext, rustCrate: RustCrate) {
    override fun extras(codegenContext: ClientCodegenContext, rustCrate: RustCrate) {
        val endpointDiscovery = InlineAwsDependency.forRustFile(
        val endpointDiscovery = InlineAwsDependency.forRustFile(
            "endpoint_discovery",
            "endpoint_discovery",
@@ -87,7 +88,7 @@ class TimestreamDecorator : ClientCodegenDecorator {
                            time
                            time
                        )
                        )
                        .await?;
                        .await?;
                        new_conf.endpoint_resolver = ::std::sync::Arc::new(resolver);
                        new_conf.endpoint_resolver = #{SharedEndpointResolver}::new(resolver);
                        Ok((Self::from_conf(new_conf), reloader))
                        Ok((Self::from_conf(new_conf), reloader))
                    }
                    }
                }
                }
@@ -96,6 +97,8 @@ class TimestreamDecorator : ClientCodegenDecorator {
                "endpoint_discovery" to endpointDiscovery.toType(),
                "endpoint_discovery" to endpointDiscovery.toType(),
                "SystemTime" to RuntimeType.std.resolve("time::SystemTime"),
                "SystemTime" to RuntimeType.std.resolve("time::SystemTime"),
                "Duration" to RuntimeType.std.resolve("time::Duration"),
                "Duration" to RuntimeType.std.resolve("time::Duration"),
                "SharedEndpointResolver" to RuntimeType.smithyHttp(codegenContext.runtimeConfig)
                    .resolve("endpoint::SharedEndpointResolver"),
                "SystemTimeSource" to RuntimeType.smithyAsync(codegenContext.runtimeConfig)
                "SystemTimeSource" to RuntimeType.smithyAsync(codegenContext.runtimeConfig)
                    .resolve("time::SystemTimeSource"),
                    .resolve("time::SystemTimeSource"),
                *Types(codegenContext.runtimeConfig).toArray(),
                *Types(codegenContext.runtimeConfig).toArray(),
+12 −7
Original line number Original line Diff line number Diff line
@@ -13,6 +13,7 @@ import software.amazon.smithy.rust.codegen.core.rustlang.Writable
import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate
import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate
import software.amazon.smithy.rust.codegen.core.rustlang.writable
import software.amazon.smithy.rust.codegen.core.rustlang.writable
import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType
import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType
import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope


/**
/**
 * Customization which injects an Endpoints 2.0 Endpoint Resolver into the service config struct
 * Customization which injects an Endpoints 2.0 Endpoint Resolver into the service config struct
@@ -28,14 +29,17 @@ internal class EndpointConfigCustomization(


    override fun section(section: ServiceConfig): Writable {
    override fun section(section: ServiceConfig): Writable {
        return writable {
        return writable {
            val sharedEndpointResolver = "#{SharedEndpointResolver}<#{Params}>"
            val resolverTrait = "#{SmithyResolver}<#{Params}>"
            val resolverTrait = "#{SmithyResolver}<#{Params}>"
            val codegenScope = arrayOf(
            val codegenScope = arrayOf(
                *preludeScope,
                "SharedEndpointResolver" to types.sharedEndpointResolver,
                "SmithyResolver" to types.resolveEndpoint,
                "SmithyResolver" to types.resolveEndpoint,
                "Params" to typesGenerator.paramsStruct(),
                "Params" to typesGenerator.paramsStruct(),
            )
            )
            when (section) {
            when (section) {
                is ServiceConfig.ConfigStruct -> rustTemplate(
                is ServiceConfig.ConfigStruct -> rustTemplate(
                    "pub (crate) endpoint_resolver: std::sync::Arc<dyn $resolverTrait>,",
                    "pub (crate) endpoint_resolver: $sharedEndpointResolver,",
                    *codegenScope,
                    *codegenScope,
                )
                )


@@ -43,7 +47,7 @@ internal class EndpointConfigCustomization(
                    rustTemplate(
                    rustTemplate(
                        """
                        """
                        /// Returns the endpoint resolver.
                        /// Returns the endpoint resolver.
                        pub fn endpoint_resolver(&self) -> std::sync::Arc<dyn $resolverTrait> {
                        pub fn endpoint_resolver(&self) -> $sharedEndpointResolver {
                            self.endpoint_resolver.clone()
                            self.endpoint_resolver.clone()
                        }
                        }
                        """,
                        """,
@@ -52,7 +56,7 @@ internal class EndpointConfigCustomization(


                is ServiceConfig.BuilderStruct ->
                is ServiceConfig.BuilderStruct ->
                    rustTemplate(
                    rustTemplate(
                        "endpoint_resolver: Option<std::sync::Arc<dyn $resolverTrait>>,",
                        "endpoint_resolver: #{Option}<$sharedEndpointResolver>,",
                        *codegenScope,
                        *codegenScope,
                    )
                    )


@@ -99,7 +103,7 @@ internal class EndpointConfigCustomization(
                        /// Sets the endpoint resolver to use when making requests.
                        /// Sets the endpoint resolver to use when making requests.
                        $defaultResolverDocs
                        $defaultResolverDocs
                        pub fn endpoint_resolver(mut self, endpoint_resolver: impl $resolverTrait + 'static) -> Self {
                        pub fn endpoint_resolver(mut self, endpoint_resolver: impl $resolverTrait + 'static) -> Self {
                            self.endpoint_resolver = Some(std::sync::Arc::new(endpoint_resolver) as _);
                            self.endpoint_resolver = #{Some}(#{SharedEndpointResolver}::new(endpoint_resolver));
                            self
                            self
                        }
                        }


@@ -107,7 +111,7 @@ internal class EndpointConfigCustomization(
                        ///
                        ///
                        /// When unset, the client will used a generated endpoint resolver based on the endpoint resolution
                        /// When unset, the client will used a generated endpoint resolver based on the endpoint resolution
                        /// rules for `$moduleUseName`.
                        /// rules for `$moduleUseName`.
                        pub fn set_endpoint_resolver(&mut self, endpoint_resolver: Option<std::sync::Arc<dyn $resolverTrait>>) -> &mut Self {
                        pub fn set_endpoint_resolver(&mut self, endpoint_resolver: #{Option}<$sharedEndpointResolver>) -> &mut Self {
                            self.endpoint_resolver = endpoint_resolver;
                            self.endpoint_resolver = endpoint_resolver;
                            self
                            self
                        }
                        }
@@ -122,7 +126,7 @@ internal class EndpointConfigCustomization(
                        rustTemplate(
                        rustTemplate(
                            """
                            """
                            endpoint_resolver: self.endpoint_resolver.unwrap_or_else(||
                            endpoint_resolver: self.endpoint_resolver.unwrap_or_else(||
                                std::sync::Arc::new(#{DefaultResolver}::new())
                                #{SharedEndpointResolver}::new(#{DefaultResolver}::new())
                            ),
                            ),
                            """,
                            """,
                            *codegenScope,
                            *codegenScope,
@@ -150,8 +154,9 @@ internal class EndpointConfigCustomization(
                        // always fail. In the future, this will be changed to an `expect()`
                        // always fail. In the future, this will be changed to an `expect()`
                        rustTemplate(
                        rustTemplate(
                            """
                            """
                            endpoint_resolver: self.endpoint_resolver.unwrap_or_else(||std::sync::Arc::new(#{FailingResolver})),
                            endpoint_resolver: self.endpoint_resolver.unwrap_or_else(||#{SharedEndpointResolver}::new(#{FailingResolver})),
                            """,
                            """,
                            *codegenScope,
                            "FailingResolver" to alwaysFailsResolver,
                            "FailingResolver" to alwaysFailsResolver,
                        )
                        )
                    }
                    }
+2 −0
Original line number Original line Diff line number Diff line
@@ -169,12 +169,14 @@ class EndpointsDecorator : ClientCodegenDecorator {
            val codegenScope = arrayOf(
            val codegenScope = arrayOf(
                *RuntimeType.preludeScope,
                *RuntimeType.preludeScope,
                "Params" to typesGenerator.paramsStruct(),
                "Params" to typesGenerator.paramsStruct(),
                "ResolveEndpoint" to types.resolveEndpoint,
                "ResolveEndpointError" to types.resolveEndpointError,
                "ResolveEndpointError" to types.resolveEndpointError,
            )
            )
            return when (section) {
            return when (section) {
                is OperationSection.MutateInput -> writable {
                is OperationSection.MutateInput -> writable {
                    rustTemplate(
                    rustTemplate(
                        """
                        """
                        use #{ResolveEndpoint};
                        let params_result = #{Params}::builder()#{builderFields:W}.build()
                        let params_result = #{Params}::builder()#{builderFields:W}.build()
                            .map_err(|err| #{ResolveEndpointError}::from_source("could not construct endpoint parameters", err));
                            .map_err(|err| #{ResolveEndpointError}::from_source("could not construct endpoint parameters", err));
                        let (endpoint_result, params) = match params_result {
                        let (endpoint_result, params) = match params_result {
+1 −0
Original line number Original line Diff line number Diff line
@@ -48,6 +48,7 @@ class Types(runtimeConfig: RuntimeConfig) {
    private val smithyTypesEndpointModule = RuntimeType.smithyTypes(runtimeConfig).resolve("endpoint")
    private val smithyTypesEndpointModule = RuntimeType.smithyTypes(runtimeConfig).resolve("endpoint")
    val smithyHttpEndpointModule = RuntimeType.smithyHttp(runtimeConfig).resolve("endpoint")
    val smithyHttpEndpointModule = RuntimeType.smithyHttp(runtimeConfig).resolve("endpoint")
    val resolveEndpoint = smithyHttpEndpointModule.resolve("ResolveEndpoint")
    val resolveEndpoint = smithyHttpEndpointModule.resolve("ResolveEndpoint")
    val sharedEndpointResolver = smithyHttpEndpointModule.resolve("SharedEndpointResolver")
    val smithyEndpoint = smithyTypesEndpointModule.resolve("Endpoint")
    val smithyEndpoint = smithyTypesEndpointModule.resolve("Endpoint")
    val resolveEndpointError = smithyHttpEndpointModule.resolve("ResolveEndpointError")
    val resolveEndpointError = smithyHttpEndpointModule.resolve("ResolveEndpointError")


Loading