diff --git a/IntegrationTests/Services/AWSCognitoIdentityIntegrationTests/UnauthenticatedAPITests.swift b/IntegrationTests/Services/AWSCognitoIdentityIntegrationTests/UnauthenticatedAPITests.swift index 5b08113d537..5ed942b8c98 100644 --- a/IntegrationTests/Services/AWSCognitoIdentityIntegrationTests/UnauthenticatedAPITests.swift +++ b/IntegrationTests/Services/AWSCognitoIdentityIntegrationTests/UnauthenticatedAPITests.swift @@ -32,7 +32,7 @@ class UnauthenticatedAPITests: XCTestCase { cognitoIdentityClient = try CognitoIdentityClient(region: region) // CognitoIdentity client for calling unauthenticated API against an identity pool. - let config = try await CognitoIdentityClient.CognitoIdentityClientConfiguration(region: region) + var config = try await CognitoIdentityClient.CognitoIdentityClientConfiguration(region: region) config.addInterceptorProvider(GetHeadersBeforeTransmitProvider()) cognitoIdentityUnauthenticatedCheckClient = CognitoIdentityClient(config: config) diff --git a/IntegrationTests/Services/AWSS3IntegrationTests/ProcessAWSCredentialIdentityResolverTests.swift b/IntegrationTests/Services/AWSS3IntegrationTests/ProcessAWSCredentialIdentityResolverTests.swift index 205f8c44920..a2cb2ab3ce8 100644 --- a/IntegrationTests/Services/AWSS3IntegrationTests/ProcessAWSCredentialIdentityResolverTests.swift +++ b/IntegrationTests/Services/AWSS3IntegrationTests/ProcessAWSCredentialIdentityResolverTests.swift @@ -24,7 +24,7 @@ class ProcessAWSCredentialIdentityResolverTests: XCTestCase { ) // Setup S3ClientConfiguration to use ProcessAWSCredentialIdentityResolver - let testConfig = try await S3Client.S3ClientConfiguration() + var testConfig = try await S3Client.S3ClientConfiguration() testConfig.awsCredentialIdentityResolver = processAWSCredentialIdentityResolver // Initialize our S3 client with the specified configuration diff --git a/IntegrationTests/Services/AWSS3IntegrationTests/S3ErrorIn200Test.swift b/IntegrationTests/Services/AWSS3IntegrationTests/S3ErrorIn200Test.swift index 4483a41a956..2488a31697b 100644 --- a/IntegrationTests/Services/AWSS3IntegrationTests/S3ErrorIn200Test.swift +++ b/IntegrationTests/Services/AWSS3IntegrationTests/S3ErrorIn200Test.swift @@ -76,7 +76,7 @@ class S3ErrorIn200Test: XCTestCase { /// S3Client throws expected InternalError error in response (200) with tag func test_foundInternalErrorExpectedError() async throws { - let config = try await S3Client.S3ClientConfiguration(region: "us-west-2") + var config = try await S3Client.S3ClientConfiguration(region: "us-west-2") config.httpClientEngine = MockHttpClientEngine(response: errorInternalErrorResponsePayload) let client = S3Client(config: config) @@ -95,7 +95,7 @@ class S3ErrorIn200Test: XCTestCase { /// S3Client throws expected SlowDown error in response (200) with tag func test_foundSlowDownExpectedError() async throws { - let config = try await S3Client.S3ClientConfiguration(region: "us-west-2") + var config = try await S3Client.S3ClientConfiguration(region: "us-west-2") config.httpClientEngine = MockHttpClientEngine(response: errorSlowDownResponsePayload) let client = S3Client(config: config) @@ -114,7 +114,7 @@ class S3ErrorIn200Test: XCTestCase { /// S3Client does not throw error when is not at the root func test_noErrorExpected() async throws { - let config = try await S3Client.S3ClientConfiguration(region: "us-west-2") + var config = try await S3Client.S3ClientConfiguration(region: "us-west-2") config.httpClientEngine = MockHttpClientEngine(response: shouldNotApplyResponsePayload) let client = S3Client(config: config) diff --git a/IntegrationTests/Services/AWSS3IntegrationTests/S3FlexibleChecksumsTests.swift b/IntegrationTests/Services/AWSS3IntegrationTests/S3FlexibleChecksumsTests.swift index aca7dcb6d02..0793f825813 100644 --- a/IntegrationTests/Services/AWSS3IntegrationTests/S3FlexibleChecksumsTests.swift +++ b/IntegrationTests/Services/AWSS3IntegrationTests/S3FlexibleChecksumsTests.swift @@ -114,7 +114,7 @@ final class S3FlexibleChecksumsTests: S3XCTestCase { } func test_putGetObject_streamining_unsigned_chunked() async throws { - let config = try await S3Client.S3ClientConfiguration(region: region) + var config = try await S3Client.S3ClientConfiguration(region: region) config.addInterceptorProvider(DisablePayloadSigningProvider()) let customizedClient = S3Client(config: config) diff --git a/IntegrationTests/Services/AWSS3IntegrationTests/SSOAWSCredentialIdentityResolverTests.swift b/IntegrationTests/Services/AWSS3IntegrationTests/SSOAWSCredentialIdentityResolverTests.swift index 9cff2592e23..dd499f35f2c 100644 --- a/IntegrationTests/Services/AWSS3IntegrationTests/SSOAWSCredentialIdentityResolverTests.swift +++ b/IntegrationTests/Services/AWSS3IntegrationTests/SSOAWSCredentialIdentityResolverTests.swift @@ -116,7 +116,7 @@ class SSOAWSCredentialIdentityResolverTests : XCTestCase { let ssoAWSCredentialIdentityResolver = try SSOAWSCredentialIdentityResolver() // Setup S3ClientConfiguration to use SSOAWSCredentialIdentityResolver - let testConfig = try await S3Client.S3ClientConfiguration() + var testConfig = try await S3Client.S3ClientConfiguration() testConfig.awsCredentialIdentityResolver = ssoAWSCredentialIdentityResolver testConfig.region = region diff --git a/Sources/Core/AWSClientRuntime/Sources/AWSClientRuntime/Config/AWSRegionClientConfiguration.swift b/Sources/Core/AWSClientRuntime/Sources/AWSClientRuntime/Config/AWSRegionClientConfiguration.swift index 296e0199516..007ec02b5ed 100644 --- a/Sources/Core/AWSClientRuntime/Sources/AWSClientRuntime/Config/AWSRegionClientConfiguration.swift +++ b/Sources/Core/AWSClientRuntime/Sources/AWSClientRuntime/Config/AWSRegionClientConfiguration.swift @@ -5,7 +5,9 @@ // SPDX-License-Identifier: Apache-2.0 // -public protocol AWSRegionClientConfiguration { +import protocol ClientRuntime.ClientConfiguration + +public protocol AWSRegionClientConfiguration: ClientConfiguration { /// The AWS region to use, i.e. `us-east-1` or `us-west-2`, etc. /// diff --git a/Sources/Core/AWSClientRuntime/Sources/AWSClientRuntime/Plugins/DefaultAWSClientPlugin.swift b/Sources/Core/AWSClientRuntime/Sources/AWSClientRuntime/Plugins/DefaultAWSClientPlugin.swift index 6bcad5a2b1c..dd44cf2e09e 100644 --- a/Sources/Core/AWSClientRuntime/Sources/AWSClientRuntime/Plugins/DefaultAWSClientPlugin.swift +++ b/Sources/Core/AWSClientRuntime/Sources/AWSClientRuntime/Plugins/DefaultAWSClientPlugin.swift @@ -5,24 +5,24 @@ // SPDX-License-Identifier: Apache-2.0 // -import ClientRuntime +import protocol ClientRuntime.DefaultClientConfiguration +import protocol ClientRuntime.Plugin -public class DefaultAWSClientPlugin: Plugin { +public class DefaultAWSClientPlugin< + Config: DefaultClientConfiguration & AWSDefaultClientConfiguration & AWSRegionClientConfiguration +>: Plugin { private var clientName: String public init(clientName: String) { self.clientName = clientName } - public func configureClient(clientConfiguration: ClientConfiguration) throws { - if var config = clientConfiguration as? (DefaultClientConfiguration - & AWSDefaultClientConfiguration - & AWSRegionClientConfiguration) { - config.retryStrategyOptions = try AWSClientConfigDefaultsProvider.retryStrategyOptions( - config.awsRetryMode, - config.maxAttempts - ) - config.awsCredentialIdentityResolver = try AWSClientConfigDefaultsProvider.awsCredentialIdentityResolver() - } + public func configureClient(clientConfiguration: inout Config) async throws { + clientConfiguration.retryStrategyOptions = try AWSClientConfigDefaultsProvider.retryStrategyOptions( + clientConfiguration.awsRetryMode, + clientConfiguration.maxAttempts + ) + clientConfiguration.awsCredentialIdentityResolver = + try AWSClientConfigDefaultsProvider.awsCredentialIdentityResolver() } } diff --git a/Sources/Core/AWSClientRuntime/Sources/AWSClientRuntime/Plugins/RegionPlugin.swift b/Sources/Core/AWSClientRuntime/Sources/AWSClientRuntime/Plugins/RegionPlugin.swift index 3282e924285..8c7e0d7102e 100644 --- a/Sources/Core/AWSClientRuntime/Sources/AWSClientRuntime/Plugins/RegionPlugin.swift +++ b/Sources/Core/AWSClientRuntime/Sources/AWSClientRuntime/Plugins/RegionPlugin.swift @@ -7,17 +7,15 @@ import ClientRuntime -public class RegionPlugin: Plugin { +public class RegionPlugin: Plugin { private var region: String public init(_ region: String) { self.region = region } - public func configureClient(clientConfiguration: ClientConfiguration) { - if var config = clientConfiguration as? AWSRegionClientConfiguration { - config.region = self.region - config.signingRegion = self.region - } + public func configureClient(clientConfiguration: inout Config) { + clientConfiguration.region = self.region + clientConfiguration.signingRegion = self.region } } diff --git a/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/AWSHttpProtocolServiceClient.kt b/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/AWSHttpProtocolServiceClient.kt index 06f78810b76..0a436b95d9e 100644 --- a/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/AWSHttpProtocolServiceClient.kt +++ b/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/AWSHttpProtocolServiceClient.kt @@ -132,7 +132,7 @@ class AWSHttpProtocolServiceClient( */ private fun renderRegionConfigInitializer(properties: List) { writer.openBlock( - "public convenience init(region: \$N) throws {", + "public init(region: \$N) throws {", "}", SwiftTypes.String, ) { diff --git a/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/plugins/AuthSchemePlugin.kt b/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/plugins/AuthSchemePlugin.kt index ff436eb7738..856a43b2f2b 100644 --- a/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/plugins/AuthSchemePlugin.kt +++ b/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/plugins/AuthSchemePlugin.kt @@ -57,23 +57,21 @@ class AuthSchemePlugin( } writer.write("") writer.openBlock( - "public func configureClient(clientConfiguration: \$N) throws {", + "public func configureClient(clientConfiguration: inout \$L) throws {", "}", - ClientRuntimeTypes.Core.ClientConfiguration, + serviceConfig.typeName, ) { - writer.openBlock("if let config = clientConfiguration as? ${serviceConfig.typeName} {", "}") { - writer.openBlock("if (self.authSchemes != nil) {", "}") { - writer.write("config.authSchemes = self.authSchemes") - } - writer.openBlock("if (self.authSchemeResolver != nil) {", "}") { - writer.write("config.authSchemeResolver = self.authSchemeResolver!") - } - writer.openBlock("if (self.awsCredentialIdentityResolver != nil) {", "}") { - writer.write("config.awsCredentialIdentityResolver = self.awsCredentialIdentityResolver!") - } - writer.openBlock("if (self.bearerTokenIdentityResolver != nil) {", "}") { - writer.write("config.bearerTokenIdentityResolver = self.bearerTokenIdentityResolver!") - } + writer.openBlock("if self.authSchemes != nil {", "}") { + writer.write("clientConfiguration.authSchemes = self.authSchemes") + } + writer.openBlock("if self.authSchemeResolver != nil {", "}") { + writer.write("clientConfiguration.authSchemeResolver = self.authSchemeResolver!") + } + writer.openBlock("if self.awsCredentialIdentityResolver != nil {", "}") { + writer.write("clientConfiguration.awsCredentialIdentityResolver = self.awsCredentialIdentityResolver!") + } + writer.openBlock("if self.bearerTokenIdentityResolver != nil {", "}") { + writer.write("clientConfiguration.bearerTokenIdentityResolver = self.bearerTokenIdentityResolver!") } } } diff --git a/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/plugins/DefaultAWSAuthSchemePlugin.kt b/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/plugins/DefaultAWSAuthSchemePlugin.kt index 49d067bc248..007531e30f6 100644 --- a/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/plugins/DefaultAWSAuthSchemePlugin.kt +++ b/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/plugins/DefaultAWSAuthSchemePlugin.kt @@ -36,32 +36,30 @@ class DefaultAWSAuthSchemePlugin( writer.write("public init() {}") writer.write("") writer.openBlock( - "public func configureClient(clientConfiguration: \$N) throws {", + "public func configureClient(clientConfiguration: inout \$L) throws {", "}", - ClientRuntimeTypes.Core.ClientConfiguration, + serviceConfig.typeName, ) { - writer.openBlock("if let config = clientConfiguration as? ${serviceConfig.typeName} {", "}") { + writer.write( + "clientConfiguration.authSchemeResolver = \$L", + "Default${AuthSchemeResolverGenerator.getSdkId(ctx)}AuthSchemeResolver()", + ) + writer.write("clientConfiguration.authSchemes = \$L", AWSAuthUtils(ctx).getModeledAuthSchemesSupportedBySDK(ctx, writer)) + writer.write( + "clientConfiguration.awsCredentialIdentityResolver = try \$N.awsCredentialIdentityResolver()", + AWSClientRuntimeTypes.Core.AWSClientConfigDefaultsProvider, + ) + if (AuthUtils(ctx).isSupportedAuthScheme(HttpBearerAuthTrait.ID)) { writer.write( - "config.authSchemeResolver = \$L", - "Default${AuthSchemeResolverGenerator.getSdkId(ctx)}AuthSchemeResolver()", + "clientConfiguration.bearerTokenIdentityResolver = try \$N()", + AWSSDKIdentityTypes.DefaultBearerTokenIdentityResolverChain, ) - writer.write("config.authSchemes = \$L", AWSAuthUtils(ctx).getModeledAuthSchemesSupportedBySDK(ctx, writer)) + } else { writer.write( - "config.awsCredentialIdentityResolver = try \$N.awsCredentialIdentityResolver()", - AWSClientRuntimeTypes.Core.AWSClientConfigDefaultsProvider, + "clientConfiguration.bearerTokenIdentityResolver = \$N(token: \$N(token: \"\"))", + SmithyIdentityTypes.StaticBearerTokenIdentityResolver, + SmithyIdentityTypes.BearerTokenIdentity, ) - if (AuthUtils(ctx).isSupportedAuthScheme(HttpBearerAuthTrait.ID)) { - writer.write( - "config.bearerTokenIdentityResolver = try \$N()", - AWSSDKIdentityTypes.DefaultBearerTokenIdentityResolverChain, - ) - } else { - writer.write( - "config.bearerTokenIdentityResolver = \$N(token: \$N(token: \"\"))", - SmithyIdentityTypes.StaticBearerTokenIdentityResolver, - SmithyIdentityTypes.BearerTokenIdentity, - ) - } } } } diff --git a/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/plugins/DefaultAWSClientPlugin.kt b/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/plugins/DefaultAWSClientPlugin.kt index 21d58bb15eb..f2edbd04954 100644 --- a/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/plugins/DefaultAWSClientPlugin.kt +++ b/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/plugins/DefaultAWSClientPlugin.kt @@ -16,7 +16,5 @@ class DefaultAWSClientPlugin : Plugin { override val isDefault: Boolean get() = true - override fun customInitialization(writer: SwiftWriter) { - writer.writeInline("\$N(clientName: self.clientName)", className) - } + override fun customInitialization(writer: SwiftWriter): String = writer.format("\$N(clientName: self.clientName)", className) } diff --git a/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/plugins/EndpointPlugin.kt b/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/plugins/EndpointPlugin.kt index 7fdbca36762..48bda181ff1 100644 --- a/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/plugins/EndpointPlugin.kt +++ b/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/plugins/EndpointPlugin.kt @@ -7,6 +7,7 @@ import software.amazon.smithy.swift.codegen.integration.Plugin import software.amazon.smithy.swift.codegen.integration.ProtocolGenerator import software.amazon.smithy.swift.codegen.integration.ServiceConfig import software.amazon.smithy.swift.codegen.model.buildSymbol +import software.amazon.smithy.swift.codegen.swiftmodules.ClientRuntimeTypes import software.amazon.smithy.swift.codegen.utils.toUpperCamelCase class EndpointPlugin( @@ -24,7 +25,7 @@ class EndpointPlugin( ctx: ProtocolGenerator.GenerationContext, writer: SwiftWriter, ) { - writer.openBlock("public class $pluginName: Plugin {", "}") { + writer.openBlock("public class \$L: \$N {", "}", pluginName, ClientRuntimeTypes.Core.Plugin) { writer.write("private var endpointResolver: \$L", EndpointTypes.EndpointResolver) writer.write("") writer.openBlock("public init(endpointResolver: \$L) {", "}", EndpointTypes.EndpointResolver) { @@ -35,10 +36,12 @@ class EndpointPlugin( writer.write("self.init(endpointResolver: try \$L())", EndpointTypes.DefaultEndpointResolver) } writer.write("") - writer.openBlock("public func configureClient(clientConfiguration: ClientRuntime.ClientConfiguration) throws {", "}") { - writer.openBlock("if let config = clientConfiguration as? ${serviceConfig.typeName} {", "}") { - writer.write("config.endpointResolver = self.endpointResolver") - } + writer.openBlock( + "public func configureClient(clientConfiguration: inout \$L) {", + "}", + serviceConfig.typeName, + ) { + writer.write("clientConfiguration.endpointResolver = self.endpointResolver") } } writer.write("") diff --git a/codegen/smithy-aws-swift-codegen/src/test/kotlin/software/amazon/smithy/aws/swift/codegen/awsrestjson/AWSRestJson1ProtocolGeneratorTests.kt b/codegen/smithy-aws-swift-codegen/src/test/kotlin/software/amazon/smithy/aws/swift/codegen/awsrestjson/AWSRestJson1ProtocolGeneratorTests.kt index f853f3b1011..abf168b4ed9 100644 --- a/codegen/smithy-aws-swift-codegen/src/test/kotlin/software/amazon/smithy/aws/swift/codegen/awsrestjson/AWSRestJson1ProtocolGeneratorTests.kt +++ b/codegen/smithy-aws-swift-codegen/src/test/kotlin/software/amazon/smithy/aws/swift/codegen/awsrestjson/AWSRestJson1ProtocolGeneratorTests.kt @@ -83,7 +83,7 @@ public class ExampleClient: ClientRuntime.Client { extension ExampleClient { - public class ExampleClientConfiguration: AWSClientRuntime.AWSDefaultClientConfiguration & AWSClientRuntime.AWSRegionClientConfiguration & ClientRuntime.DefaultClientConfiguration & ClientRuntime.DefaultHttpClientConfiguration { + public struct ExampleClientConfiguration: AWSClientRuntime.AWSDefaultClientConfiguration & AWSClientRuntime.AWSRegionClientConfiguration & ClientRuntime.DefaultClientConfiguration & ClientRuntime.DefaultHttpClientConfiguration { public var useFIPS: Swift.Bool? public var useDualStack: Swift.Bool? public var appID: Swift.String? @@ -163,7 +163,7 @@ extension ExampleClient { self.logger = telemetryProvider.loggerProvider.getLogger(name: ExampleClient.clientName) } - public convenience init( + public init( useFIPS: Swift.Bool? = nil, useDualStack: Swift.Bool? = nil, appID: Swift.String? = nil, @@ -217,7 +217,7 @@ extension ExampleClient { ) } - public convenience init( + public init( useFIPS: Swift.Bool? = nil, useDualStack: Swift.Bool? = nil, appID: Swift.String? = nil, @@ -271,7 +271,7 @@ extension ExampleClient { ) } - public convenience required init() async throws { + public init() async throws { try await self.init( useFIPS: nil, useDualStack: nil, @@ -300,7 +300,7 @@ extension ExampleClient { ) } - public convenience init(region: Swift.String) throws { + public init(region: Swift.String) throws { self.init( nil, nil, @@ -333,22 +333,21 @@ extension ExampleClient { return "\(ExampleClient.clientName) - \(region ?? "")" } - public func addInterceptorProvider(_ provider: ClientRuntime.InterceptorProvider) { + public mutating func addInterceptorProvider(_ provider: ClientRuntime.InterceptorProvider) { self.interceptorProviders.append(provider) } - public func addInterceptorProvider(_ provider: ClientRuntime.HttpInterceptorProvider) { + public mutating func addInterceptorProvider(_ provider: ClientRuntime.HttpInterceptorProvider) { self.httpInterceptorProviders.append(provider) } } public static func builder() -> ClientRuntime.ClientBuilder { - return ClientRuntime.ClientBuilder(defaultPlugins: [ - ClientRuntime.DefaultClientPlugin(), - AWSClientRuntime.DefaultAWSClientPlugin(clientName: self.clientName), - DefaultAWSAuthSchemePlugin() - ]) + return ClientRuntime.ClientBuilder() + .withPlugin(ClientRuntime.DefaultClientPlugin()) + .withPlugin(AWSClientRuntime.DefaultAWSClientPlugin(clientName: self.clientName)) + .withPlugin(DefaultAWSAuthSchemePlugin()) } } """