diff --git a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecorator.kt b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecorator.kt index e59eaa7bc8..c202b5c4cd 100644 --- a/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecorator.kt +++ b/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecorator.kt @@ -57,7 +57,9 @@ fun ClientCodegenContext.getBuiltIn(builtIn: String): Parameter? { } private fun promotedBuiltins(parameter: Parameter) = - parameter == Builtins.FIPS || parameter == Builtins.DUALSTACK || parameter == Builtins.SDK_ENDPOINT + parameter.builtIn == Builtins.FIPS.builtIn || + parameter.builtIn == Builtins.DUALSTACK.builtIn || + parameter.builtIn == Builtins.SDK_ENDPOINT.builtIn private fun configParamNewtype(parameter: Parameter, name: String, runtimeConfig: RuntimeConfig): RuntimeType { val type = parameter.symbol().mapRustType { t -> t.stripOuter() } @@ -204,6 +206,9 @@ val PromotedBuiltInsDecorators = decoratorForBuiltIn(Builtins.DUALSTACK), decoratorForBuiltIn( Builtins.SDK_ENDPOINT, - ConfigParam.Builder().name("endpoint_url").type(RuntimeType.String.toSymbol()).setterDocs(endpointUrlDocs), + ConfigParam.Builder() + .name("endpoint_url") + .type(RuntimeType.String.toSymbol()) + .setterDocs(endpointUrlDocs), ), ).toTypedArray() diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecoratorTest.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecoratorTest.kt new file mode 100644 index 0000000000..ad84fb54df --- /dev/null +++ b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecoratorTest.kt @@ -0,0 +1,119 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rustsdk + +import org.junit.jupiter.api.Test +import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency +import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel +import software.amazon.smithy.rust.codegen.core.testutil.integrationTest + +class EndpointBuiltInsDecoratorTest { + private val endpointUrlModel = """ + namespace test + + use aws.api#service + use aws.auth#sigv4 + use aws.protocols#restJson1 + use smithy.rules#endpointRuleSet + + @service(sdkId: "dontcare") + @restJson1 + @sigv4(name: "dontcare") + @auth([sigv4]) + @endpointRuleSet({ + "version": "1.0" + "parameters": { + "endpoint": { "required": false, "type": "string", "builtIn": "SDK::Endpoint" }, + "region": { "required": false, "type": "String", "builtIn": "AWS::Region" }, + } + "rules": [ + { + "type": "endpoint" + "conditions": [ + {"fn": "isSet", "argv": [{"ref": "endpoint"}]}, + {"fn": "isSet", "argv": [{"ref": "region"}]} + ], + "endpoint": { + "url": "{endpoint}" + "properties": { + "authSchemes": [{"name": "sigv4","signingRegion": "{region}"}] + } + } + }, + { + "type": "endpoint" + "conditions": [ + {"fn": "isSet", "argv": [{"ref": "region"}]}, + ], + "endpoint": { + "url": "https://WRONG/" + "properties": { + "authSchemes": [{"name": "sigv4", "signingRegion": "{region}"}] + } + } + } + ] + }) + service TestService { + version: "2023-01-01", + operations: [SomeOperation] + } + + structure SomeOutput { + someAttribute: Long, + someVal: String + } + + @http(uri: "/SomeOperation", method: "GET") + @optionalAuth + operation SomeOperation { + output: SomeOutput + } + """.asSmithyModel() + + @Test + fun endpointUrlBuiltInWorksEndToEnd() { + awsSdkIntegrationTest( + endpointUrlModel, + generateOrchestrator = true, + ) { codegenContext, rustCrate -> + rustCrate.integrationTest("endpoint_url_built_in_works") { + val module = codegenContext.moduleUseName() + rustTemplate( + """ + use $module::{Config, Client, config::Region}; + + ##[#{tokio}::test] + async fn endpoint_url_built_in_works() { + let connector = #{TestConnection}::new(vec![( + http::Request::builder() + .uri("https://RIGHT/SomeOperation") + .body(#{SdkBody}::empty()) + .unwrap(), + http::Response::builder().status(200).body("").unwrap(), + )]); + let config = Config::builder() + .http_connector(connector.clone()) + .region(Region::new("us-east-1")) + .endpoint_url("https://RIGHT") + .build(); + let client = Client::from_conf(config); + dbg!(client.some_operation().send().await).expect("success"); + connector.assert_requests_match(&[]); + } + """, + "tokio" to CargoDependency.Tokio.toDevDependency().withFeature("rt").withFeature("macros").toType(), + "TestConnection" to CargoDependency.smithyClient(codegenContext.runtimeConfig) + .toDevDependency().withFeature("test-util").toType() + .resolve("test_connection::TestConnection"), + "SdkBody" to RuntimeType.sdkBody(codegenContext.runtimeConfig), + ) + } + } + } +} diff --git a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/TestUtil.kt b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/TestUtil.kt index 44ed5461a9..3dc959abce 100644 --- a/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/TestUtil.kt +++ b/aws/sdk-codegen/src/test/kotlin/software/amazon/smithy/rustsdk/TestUtil.kt @@ -6,6 +6,7 @@ package software.amazon.smithy.rustsdk import software.amazon.smithy.model.Model +import software.amazon.smithy.model.node.BooleanNode import software.amazon.smithy.model.node.ObjectNode import software.amazon.smithy.model.node.StringNode import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext @@ -65,6 +66,7 @@ fun awsSdkIntegrationTest( .withMember("includeFluentClient", false) .letIf(generateOrchestrator) { it.withMember("enableNewSmithyRuntime", StringNode.from("orchestrator")) + .withMember("includeEndpointUrlConfig", BooleanNode.from(false)) } .build(), ).build(),