Skip to content

Commit

Permalink
Clean up re-exports and improve 'BuildError' conversions
Browse files Browse the repository at this point in the history
  • Loading branch information
rcoh committed Nov 10, 2023
1 parent 9a82b44 commit f1e47fc
Show file tree
Hide file tree
Showing 15 changed files with 134 additions and 75 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,9 @@ import software.amazon.smithy.rust.codegen.core.smithy.generators.LibRsSection
import software.amazon.smithy.rust.codegen.core.util.serviceNameOrDefault

private class Types(runtimeConfig: RuntimeConfig) {
private val smithyHttp = RuntimeType.smithyHttp(runtimeConfig)
private val smithyTypes = RuntimeType.smithyTypes(runtimeConfig)

val awsTypes = AwsRuntimeType.awsTypes(runtimeConfig)
val connectorError = smithyHttp.resolve("result::ConnectorError")
val retryConfig = smithyTypes.resolve("retry::RetryConfig")
val timeoutConfig = smithyTypes.resolve("timeout::TimeoutConfig")
}
Expand Down Expand Up @@ -102,7 +100,6 @@ class AwsFluentClientDecorator : ClientCodegenDecorator {
private class AwsFluentClientExtensions(private val codegenContext: ClientCodegenContext, private val types: Types) {
private val codegenScope = arrayOf(
"Arc" to RuntimeType.Arc,
"ConnectorError" to types.connectorError,
"RetryConfig" to types.retryConfig,
"TimeoutConfig" to types.timeoutConfig,
"aws_types" to types.awsTypes,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ package software.amazon.smithy.rustsdk

import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext
import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule
import software.amazon.smithy.rust.codegen.client.smithy.configReexport
import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator
import software.amazon.smithy.rust.codegen.client.smithy.customize.TestUtilFeature
import software.amazon.smithy.rust.codegen.client.smithy.endpoint.supportedAuthSchemes
Expand Down Expand Up @@ -59,11 +60,15 @@ class CredentialProviderConfig(private val codegenContext: ClientCodegenContext)
private val runtimeConfig = codegenContext.runtimeConfig
private val codegenScope = arrayOf(
*preludeScope,
"Credentials" to AwsRuntimeType.awsCredentialTypes(runtimeConfig).resolve("Credentials"),
"ProvideCredentials" to AwsRuntimeType.awsCredentialTypes(runtimeConfig)
.resolve("provider::ProvideCredentials"),
"SharedCredentialsProvider" to AwsRuntimeType.awsCredentialTypes(runtimeConfig)
.resolve("provider::SharedCredentialsProvider"),
"Credentials" to configReexport(AwsRuntimeType.awsCredentialTypes(runtimeConfig).resolve("Credentials")),
"ProvideCredentials" to configReexport(
AwsRuntimeType.awsCredentialTypes(runtimeConfig)
.resolve("provider::ProvideCredentials"),
),
"SharedCredentialsProvider" to configReexport(
AwsRuntimeType.awsCredentialTypes(runtimeConfig)
.resolve("provider::SharedCredentialsProvider"),
),
"SIGV4A_SCHEME_ID" to AwsRuntimeType.awsRuntime(runtimeConfig)
.resolve("auth::sigv4a::SCHEME_ID"),
"SIGV4_SCHEME_ID" to AwsRuntimeType.awsRuntime(runtimeConfig)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import software.amazon.smithy.model.node.Node
import software.amazon.smithy.rulesengine.aws.language.functions.AwsBuiltIns
import software.amazon.smithy.rulesengine.language.syntax.parameters.Parameter
import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext
import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule
import software.amazon.smithy.rust.codegen.client.smithy.configReexport
import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator
import software.amazon.smithy.rust.codegen.client.smithy.endpoint.EndpointCustomization
import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization
Expand All @@ -22,7 +22,6 @@ 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.smithy.RuntimeConfig
import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope
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
import software.amazon.smithy.rust.codegen.core.util.dq
Expand Down Expand Up @@ -109,14 +108,6 @@ class RegionDecorator : ClientCodegenDecorator {
}
}

override fun extras(codegenContext: ClientCodegenContext, rustCrate: RustCrate) {
if (usesRegion(codegenContext)) {
rustCrate.withModule(ClientRustModule.config) {
rust("pub use #T::Region;", region(codegenContext.runtimeConfig))
}
}
}

override fun endpointCustomizations(codegenContext: ClientCodegenContext): List<EndpointCustomization> {
if (!usesRegion(codegenContext)) {
return listOf()
Expand Down Expand Up @@ -157,7 +148,7 @@ class RegionProviderConfig(codegenContext: ClientCodegenContext) : ConfigCustomi
private val moduleUseName = codegenContext.moduleUseName()
private val codegenScope = arrayOf(
*preludeScope,
"Region" to region.resolve("Region"),
"Region" to configReexport(region.resolve("Region")),
)

override fun section(section: ServiceConfig) = writable {
Expand Down
41 changes: 41 additions & 0 deletions aws/sdk/integration-tests/dynamodb/tests/build-errors.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
/*
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/

use aws_sdk_dynamodb::error::SdkError;
use aws_sdk_dynamodb::operation::create_table::CreateTableError;
use aws_sdk_dynamodb::types::{KeySchemaElement, KeyType};
use aws_sdk_dynamodb::Client;

#[allow(dead_code)]
async fn create_table_test(client: &Client) -> Result<(), SdkError<CreateTableError>> {
let _just_checking_compilation = client
.create_table()
.table_name("test")
.key_schema(
KeySchemaElement::builder()
.attribute_name("year")
.key_type(KeyType::Hash)
.build()?,
)
.send()
.await;
Ok(())
}

#[allow(dead_code)]
async fn create_table_test_super_error(client: &Client) -> Result<(), aws_sdk_dynamodb::Error> {
let _just_checking_compilation = client
.create_table()
.table_name("test")
.key_schema(
KeySchemaElement::builder()
.attribute_name("year")
.key_type(KeyType::Hash)
.build()?,
)
.send()
.await;
Ok(())
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
/*
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/

package software.amazon.smithy.rust.codegen.client.smithy

import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate
import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType

/** Returns a symbol for a type re-exported into crate::config
* Although it is not always possible to use this, this is the preferred method for using types in config customizations
* and ensures that your type will be re-exported if it is used.
*/
fun configReexport(type: RuntimeType): RuntimeType = RuntimeType.forInlineFun(type.name, module = ClientRustModule.config) {
rustTemplate("pub use #{type};", "type" to type)
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import software.amazon.smithy.model.traits.HttpBasicAuthTrait
import software.amazon.smithy.model.traits.HttpBearerAuthTrait
import software.amazon.smithy.model.traits.HttpDigestAuthTrait
import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext
import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule
import software.amazon.smithy.rust.codegen.client.smithy.configReexport
import software.amazon.smithy.rust.codegen.client.smithy.customize.AuthSchemeOption
import software.amazon.smithy.rust.codegen.client.smithy.customize.AuthSchemeOption.StaticAuthSchemeOption
import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator
Expand All @@ -26,7 +26,6 @@ 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.writable
import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig
import software.amazon.smithy.rust.codegen.core.smithy.RustCrate
import software.amazon.smithy.rust.codegen.core.util.dq
import software.amazon.smithy.rust.codegen.core.util.getTrait
import software.amazon.smithy.rust.codegen.core.util.letIf
Expand All @@ -52,7 +51,7 @@ private fun codegenScope(runtimeConfig: RuntimeConfig): Array<Pair<String, Any>>
"Login" to smithyRuntimeApi.resolve("client::identity::http::Login"),
"SharedAuthScheme" to smithyRuntimeApi.resolve("client::auth::SharedAuthScheme"),
"SharedIdentityResolver" to smithyRuntimeApi.resolve("client::identity::SharedIdentityResolver"),
"Token" to smithyRuntimeApi.resolve("client::identity::http::Token"),
"Token" to configReexport(smithyRuntimeApi.resolve("client::identity::http::Token")),
)
}

Expand Down Expand Up @@ -135,25 +134,10 @@ class HttpAuthDecorator : ClientCodegenDecorator {
it + HttpAuthServiceRuntimePluginCustomization(codegenContext, authSchemes)
}
}

override fun extras(codegenContext: ClientCodegenContext, rustCrate: RustCrate) {
val authSchemes = HttpAuthSchemes.from(codegenContext)
if (authSchemes.anyEnabled()) {
rustCrate.withModule(ClientRustModule.config) {
val codegenScope = codegenScope(codegenContext.runtimeConfig)
if (authSchemes.isTokenBased()) {
rustTemplate("pub use #{Token};", *codegenScope)
}
if (authSchemes.isLoginBased()) {
rustTemplate("pub use #{Login};", *codegenScope)
}
}
}
}
}

private class HttpAuthServiceRuntimePluginCustomization(
private val codegenContext: ClientCodegenContext,
codegenContext: ClientCodegenContext,
private val authSchemes: HttpAuthSchemes,
) : ServiceRuntimePluginCustomization() {
private val serviceShape = codegenContext.serviceShape
Expand All @@ -167,6 +151,7 @@ private class HttpAuthServiceRuntimePluginCustomization(
rustTemplate("#{SharedAuthScheme}::new(#{Scheme})", *codegenScope, "Scheme" to scheme)
}
}

fun registerNamedAuthScheme(name: String) {
registerAuthScheme {
rustTemplate("#{$name}::new()", *codegenScope)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
package software.amazon.smithy.rust.codegen.client.smithy.customizations

import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext
import software.amazon.smithy.rust.codegen.client.smithy.configReexport
import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator
import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization
import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig
Expand All @@ -32,13 +33,13 @@ private class HttpConnectorConfigCustomization(
private val moduleUseName = codegenContext.moduleUseName()
private val codegenScope = arrayOf(
*preludeScope,
"Connection" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::orchestrator::Connection"),
"HttpClient" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::http::HttpClient"),
"IntoShared" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("shared::IntoShared"),
"Resolver" to RuntimeType.smithyRuntime(runtimeConfig).resolve("client::config_override::Resolver"),
"SharedAsyncSleep" to RuntimeType.smithyAsync(runtimeConfig).resolve("rt::sleep::SharedAsyncSleep"),
"SharedHttpClient" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::http::SharedHttpClient"),
"TimeoutConfig" to RuntimeType.smithyTypes(runtimeConfig).resolve("timeout::TimeoutConfig"),
"HttpClient" to configReexport(
RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::http::HttpClient"),
),
"IntoShared" to configReexport(RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("shared::IntoShared")),
"SharedHttpClient" to configReexport(
RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::http::SharedHttpClient"),
),
)

override fun section(section: ServiceConfig): Writable {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
package software.amazon.smithy.rust.codegen.client.smithy.customizations

import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext
import software.amazon.smithy.rust.codegen.client.smithy.configReexport
import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization
import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig
import software.amazon.smithy.rust.codegen.core.rustlang.Writable
Expand All @@ -21,8 +22,8 @@ class IdentityCacheConfigCustomization(codegenContext: ClientCodegenContext) : C
val api = RuntimeType.smithyRuntimeApi(rc)
arrayOf(
*preludeScope,
"ResolveCachedIdentity" to api.resolve("client::identity::ResolveCachedIdentity"),
"SharedIdentityCache" to api.resolve("client::identity::SharedIdentityCache"),
"ResolveCachedIdentity" to configReexport(api.resolve("client::identity::ResolveCachedIdentity")),
"SharedIdentityCache" to configReexport(api.resolve("client::identity::SharedIdentityCache")),
)
}

Expand Down Expand Up @@ -88,6 +89,7 @@ class IdentityCacheConfigCustomization(codegenContext: ClientCodegenContext) : C
*codegenScope,
)
}

is ServiceConfig.ConfigImpl -> {
rustTemplate(
"""
Expand All @@ -99,7 +101,8 @@ class IdentityCacheConfigCustomization(codegenContext: ClientCodegenContext) : C
*codegenScope,
)
}
else -> { }

else -> {}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
package software.amazon.smithy.rust.codegen.client.smithy.customizations

import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext
import software.amazon.smithy.rust.codegen.client.smithy.configReexport
import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization
import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig
import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate
Expand All @@ -17,8 +18,8 @@ class InterceptorConfigCustomization(codegenContext: ClientCodegenContext) : Con
private val runtimeConfig = codegenContext.runtimeConfig

private val codegenScope = arrayOf(
"Intercept" to RuntimeType.intercept(runtimeConfig),
"SharedInterceptor" to RuntimeType.sharedInterceptor(runtimeConfig),
"Intercept" to configReexport(RuntimeType.intercept(runtimeConfig)),
"SharedInterceptor" to configReexport(RuntimeType.sharedInterceptor(runtimeConfig)),
)

override fun section(section: ServiceConfig) =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ package software.amazon.smithy.rust.codegen.client.smithy.customizations

import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext
import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule
import software.amazon.smithy.rust.codegen.client.smithy.configReexport
import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization
import software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig
import software.amazon.smithy.rust.codegen.core.rustlang.Attribute
Expand All @@ -25,18 +26,19 @@ class ResiliencyConfigCustomization(codegenContext: ClientCodegenContext) : Conf
private val moduleUseName = codegenContext.moduleUseName()
private val codegenScope = arrayOf(
*preludeScope,
"AsyncSleep" to sleepModule.resolve("AsyncSleep"),
"AsyncSleep" to configReexport(sleepModule.resolve("AsyncSleep")),
"SharedAsyncSleep" to configReexport(sleepModule.resolve("SharedAsyncSleep")),
"Sleep" to configReexport(sleepModule.resolve("Sleep")),
"ClientRateLimiter" to retries.resolve("ClientRateLimiter"),
"ClientRateLimiterPartition" to retries.resolve("ClientRateLimiterPartition"),
"debug" to RuntimeType.Tracing.resolve("debug"),
"IntoShared" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("shared::IntoShared"),
"RetryConfig" to retryConfig.resolve("RetryConfig"),
"RetryMode" to RuntimeType.smithyTypes(runtimeConfig).resolve("retry::RetryMode"),
"RetryPartition" to retries.resolve("RetryPartition"),
"SharedAsyncSleep" to sleepModule.resolve("SharedAsyncSleep"),
"SharedRetryStrategy" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve("client::retries::SharedRetryStrategy"),
"SharedRetryStrategy" to RuntimeType.smithyRuntimeApi(runtimeConfig)
.resolve("client::retries::SharedRetryStrategy"),
"SharedTimeSource" to RuntimeType.smithyAsync(runtimeConfig).resolve("time::SharedTimeSource"),
"Sleep" to sleepModule.resolve("Sleep"),
"StandardRetryStrategy" to retries.resolve("strategy::StandardRetryStrategy"),
"SystemTime" to RuntimeType.std.resolve("time::SystemTime"),
"TimeoutConfig" to timeoutModule.resolve("TimeoutConfig"),
Expand Down Expand Up @@ -286,7 +288,7 @@ class ResiliencyReExportCustomization(codegenContext: ClientCodegenContext) {
fun extras(rustCrate: RustCrate) {
rustCrate.withModule(ClientRustModule.config) {
rustTemplate(
"pub use #{sleep}::{AsyncSleep, SharedAsyncSleep, Sleep};",
"pub use #{sleep}::{Sleep};",
"sleep" to RuntimeType.smithyAsync(runtimeConfig).resolve("rt::sleep"),
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import software.amazon.smithy.rust.codegen.core.smithy.customizations.CrateVersi
import software.amazon.smithy.rust.codegen.core.smithy.customizations.pubUseSmithyPrimitives
import software.amazon.smithy.rust.codegen.core.smithy.customizations.pubUseSmithyPrimitivesEventStream
import software.amazon.smithy.rust.codegen.core.smithy.generators.LibRsCustomization
import software.amazon.smithy.rust.codegen.core.smithy.generators.operationBuildError

val TestUtilFeature = Feature("test-util", false, listOf())

Expand Down Expand Up @@ -97,6 +98,8 @@ class RequiredCustomizations : ClientCodegenDecorator {
"""
/// Error type returned by the client.
pub type SdkError<E, R = #{R}> = #{SdkError}<E, R>;
pub use #{BuildError};
pub use #{ConnectorError};
pub use #{DisplayErrorContext};
pub use #{ProvideErrorMetadata};
Expand All @@ -105,6 +108,9 @@ class RequiredCustomizations : ClientCodegenDecorator {
"ProvideErrorMetadata" to RuntimeType.smithyTypes(rc).resolve("error::metadata::ProvideErrorMetadata"),
"R" to RuntimeType.smithyRuntimeApi(rc).resolve("client::orchestrator::HttpResponse"),
"SdkError" to RuntimeType.sdkError(rc),
// this can't use the auto-rexport because the builder generator is defined in codegen core
"BuildError" to rc.operationBuildError(),
"ConnectorError" to RuntimeType.smithyRuntimeApi(rc).resolve("client::result::ConnectorError"),
)
}

Expand Down
Loading

0 comments on commit f1e47fc

Please sign in to comment.