From 7aadd5a3a9f18413b86b2c664453e688822ae296 Mon Sep 17 00:00:00 2001 From: Josh Elkins Date: Thu, 6 Feb 2025 10:28:30 -0600 Subject: [PATCH 1/6] fix: Plugins create new config --- .../ClientRuntime/Client/ClientBuilder.swift | 27 ++++++++++------ .../Plugins/AuthSchemePlugin.swift | 18 +++++------ .../Plugins/DefaultClientPlugin.swift | 31 +++++++++---------- .../Plugins/HttpClientPlugin.swift | 12 +++---- Sources/ClientRuntime/Plugins/Plugin.swift | 6 ++-- .../ClientRuntime/Plugins/RetryPlugin.swift | 10 +++--- .../Plugins/TelemetryPlugin.swift | 11 ++++--- .../integration/HttpProtocolServiceClient.kt | 31 ++++++++----------- .../swift/codegen/integration/Plugin.kt | 4 +-- 9 files changed, 77 insertions(+), 73 deletions(-) diff --git a/Sources/ClientRuntime/Client/ClientBuilder.swift b/Sources/ClientRuntime/Client/ClientBuilder.swift index e8f007c2a..ddcdd458a 100644 --- a/Sources/ClientRuntime/Client/ClientBuilder.swift +++ b/Sources/ClientRuntime/Client/ClientBuilder.swift @@ -4,29 +4,36 @@ // // SPDX-License-Identifier: Apache-2.0 // + public class ClientBuilder { - private var plugins: [Plugin] + private struct PluginContainer: Plugin { + let plugin: any Plugin - public init(defaultPlugins: [Plugin] = []) { - self.plugins = defaultPlugins + func configureClient(clientConfiguration: ClientType.Config) async throws -> ClientType.Config { + try await plugin.configureClient(clientConfiguration: clientConfiguration) + } } - public func withPlugin(_ plugin: any Plugin) -> ClientBuilder { - self.plugins.append(plugin) + private var plugins = [PluginContainer]() + + public init() {} + + public func withPlugin(_ plugin: P) -> ClientBuilder where P.Config == ClientType.Config { + self.plugins.append(PluginContainer(plugin: plugin)) return self } public func build() async throws -> ClientType { - let configuration = try await resolve(plugins: self.plugins) + let configuration = try await resolve() return ClientType(config: configuration) } - func resolve(plugins: [any Plugin]) async throws -> ClientType.Config { - let clientConfiguration = try await ClientType.Config() + private func resolve() async throws -> ClientType.Config { + var config = try await ClientType.Config() for plugin in plugins { - try await plugin.configureClient(clientConfiguration: clientConfiguration) + config = try await plugin.configureClient(clientConfiguration: config) } - return clientConfiguration + return config } } diff --git a/Sources/ClientRuntime/Plugins/AuthSchemePlugin.swift b/Sources/ClientRuntime/Plugins/AuthSchemePlugin.swift index 4b3d016ff..921a2b53b 100644 --- a/Sources/ClientRuntime/Plugins/AuthSchemePlugin.swift +++ b/Sources/ClientRuntime/Plugins/AuthSchemePlugin.swift @@ -7,7 +7,7 @@ import SmithyHTTPAuthAPI -public class AuthSchemePlugin: Plugin { +public class AuthSchemePlugin: Plugin { private var authSchemes: [AuthScheme]? @@ -21,14 +21,14 @@ public class AuthSchemePlugin: Plugin { self.authSchemes = authSchemes } - public func configureClient(clientConfiguration: ClientConfiguration) { - if var config = clientConfiguration as? DefaultHttpClientConfiguration { - if self.authSchemes != nil { - config.authSchemes = self.authSchemes! - } - if self.authSchemeResolver != nil { - config.authSchemeResolver = self.authSchemeResolver! - } + public func configureClient(clientConfiguration: Config) -> Config { + var copy = clientConfiguration + if self.authSchemes != nil { + copy.authSchemes = self.authSchemes! } + if self.authSchemeResolver != nil { + copy.authSchemeResolver = self.authSchemeResolver! + } + return copy } } diff --git a/Sources/ClientRuntime/Plugins/DefaultClientPlugin.swift b/Sources/ClientRuntime/Plugins/DefaultClientPlugin.swift index df080b1c6..4627cfa0f 100644 --- a/Sources/ClientRuntime/Plugins/DefaultClientPlugin.swift +++ b/Sources/ClientRuntime/Plugins/DefaultClientPlugin.swift @@ -7,23 +7,22 @@ import struct SmithyRetries.DefaultRetryStrategy -public class DefaultClientPlugin: Plugin { +public class DefaultClientPlugin: Plugin { + public init() {} - public func configureClient(clientConfiguration: ClientConfiguration) { - if var config = clientConfiguration as? DefaultClientConfiguration { - config.retryStrategyOptions = - DefaultSDKRuntimeConfiguration - .defaultRetryStrategyOptions - } - if var config = clientConfiguration as? DefaultHttpClientConfiguration { - let httpClientConfiguration = - DefaultSDKRuntimeConfiguration - .defaultHttpClientConfiguration - config.httpClientConfiguration = httpClientConfiguration - config.httpClientEngine = - DefaultSDKRuntimeConfiguration - .makeClient(httpClientConfiguration: httpClientConfiguration) - } + public func configureClient(clientConfiguration: Config) async throws -> Config { + var copy = clientConfiguration + copy.retryStrategyOptions = + DefaultSDKRuntimeConfiguration + .defaultRetryStrategyOptions + let httpClientConfiguration = + DefaultSDKRuntimeConfiguration + .defaultHttpClientConfiguration + copy.httpClientConfiguration = httpClientConfiguration + copy.httpClientEngine = + DefaultSDKRuntimeConfiguration + .makeClient(httpClientConfiguration: httpClientConfiguration) + return copy } } diff --git a/Sources/ClientRuntime/Plugins/HttpClientPlugin.swift b/Sources/ClientRuntime/Plugins/HttpClientPlugin.swift index c7aea9893..880614dd3 100644 --- a/Sources/ClientRuntime/Plugins/HttpClientPlugin.swift +++ b/Sources/ClientRuntime/Plugins/HttpClientPlugin.swift @@ -8,7 +8,7 @@ import protocol SmithyHTTPAPI.HTTPClient import struct SmithyRetries.DefaultRetryStrategy -public class DefaultHttpClientPlugin: Plugin { +public class DefaultHttpClientPlugin: Plugin { var httpClientConfiguration: HttpClientConfiguration @@ -27,10 +27,10 @@ public class DefaultHttpClientPlugin: Plugin { ) } - public func configureClient(clientConfiguration: ClientConfiguration) { - if var config = clientConfiguration as? DefaultHttpClientConfiguration { - config.httpClientConfiguration = self.httpClientConfiguration - config.httpClientEngine = self.httpClient - } + public func configureClient(clientConfiguration: Config) -> Config { + var copy = clientConfiguration + copy.httpClientConfiguration = self.httpClientConfiguration + copy.httpClientEngine = self.httpClient + return copy } } diff --git a/Sources/ClientRuntime/Plugins/Plugin.swift b/Sources/ClientRuntime/Plugins/Plugin.swift index 0e6482ee1..e85bab8e9 100644 --- a/Sources/ClientRuntime/Plugins/Plugin.swift +++ b/Sources/ClientRuntime/Plugins/Plugin.swift @@ -5,6 +5,8 @@ // SPDX-License-Identifier: Apache-2.0 // -public protocol Plugin { - func configureClient(clientConfiguration: ClientConfiguration) async throws +public protocol Plugin { + associatedtype Config: ClientConfiguration + + func configureClient(clientConfiguration: Config) async throws -> Config } diff --git a/Sources/ClientRuntime/Plugins/RetryPlugin.swift b/Sources/ClientRuntime/Plugins/RetryPlugin.swift index 1799fa77e..bbc740e83 100644 --- a/Sources/ClientRuntime/Plugins/RetryPlugin.swift +++ b/Sources/ClientRuntime/Plugins/RetryPlugin.swift @@ -7,7 +7,7 @@ import struct SmithyRetriesAPI.RetryStrategyOptions -public class RetryPlugin: Plugin { +public class RetryPlugin: Plugin { private var retryStrategyOptions: RetryStrategyOptions @@ -15,9 +15,9 @@ public class RetryPlugin: Plugin { self.retryStrategyOptions = retryStrategyOptions } - public func configureClient(clientConfiguration: ClientConfiguration) { - if var config = clientConfiguration as? DefaultClientConfiguration { - config.retryStrategyOptions = self.retryStrategyOptions - } + public func configureClient(clientConfiguration: Config) -> Config { + var copy = clientConfiguration + copy.retryStrategyOptions = self.retryStrategyOptions + return copy } } diff --git a/Sources/ClientRuntime/Plugins/TelemetryPlugin.swift b/Sources/ClientRuntime/Plugins/TelemetryPlugin.swift index b9bd14066..a0196e783 100644 --- a/Sources/ClientRuntime/Plugins/TelemetryPlugin.swift +++ b/Sources/ClientRuntime/Plugins/TelemetryPlugin.swift @@ -5,7 +5,8 @@ // SPDX-License-Identifier: Apache-2.0 // -public class TelemetryPlugin: Plugin { +public class TelemetryPlugin: Plugin { + private let telemetryProvider: TelemetryProvider public init(telemetryProvider: TelemetryProvider) { @@ -26,10 +27,10 @@ public class TelemetryPlugin: Plugin { ) } - public func configureClient(clientConfiguration: ClientConfiguration) { - if var config = clientConfiguration as? DefaultClientConfiguration { - config.telemetryProvider = self.telemetryProvider - } + public func configureClient(clientConfiguration: Config) -> Config { + var copy = clientConfiguration + copy.telemetryProvider = self.telemetryProvider + return copy } } diff --git a/smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/integration/HttpProtocolServiceClient.kt b/smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/integration/HttpProtocolServiceClient.kt index 47e17dee7..5df9ca5d1 100644 --- a/smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/integration/HttpProtocolServiceClient.kt +++ b/smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/integration/HttpProtocolServiceClient.kt @@ -75,30 +75,25 @@ open class HttpProtocolServiceClient( ClientRuntimeTypes.Core.ClientBuilder, serviceSymbol.name, ) { - writer.openBlock( - "return \$N<\$L>(defaultPlugins: [", - "])", + writer.write( + "return \$N<\$L>()", ClientRuntimeTypes.Core.ClientBuilder, serviceSymbol.name, - ) { - val defaultPlugins: MutableList = mutableListOf(DefaultClientPlugin()) + ) + writer.indent() + val defaultPlugins: MutableList = mutableListOf(DefaultClientPlugin()) - ctx.integrations - .flatMap { it.plugins(serviceConfig) } - .filter { it.isDefault } - .onEach { defaultPlugins.add(it) } + ctx.integrations + .flatMap { it.plugins(serviceConfig) } + .filter { it.isDefault } + .onEach { defaultPlugins.add(it) } - val pluginsIterator = defaultPlugins.iterator() + val pluginsIterator = defaultPlugins.iterator() - while (pluginsIterator.hasNext()) { - pluginsIterator.next().customInitialization(writer) - if (pluginsIterator.hasNext()) { - writer.write(",") - } - } - - writer.unwrite(",\n").write("") + while (pluginsIterator.hasNext()) { + writer.write(".withPlugin(\$L)", pluginsIterator.next().customInitialization(writer)) } + writer.dedent() } } writer.write("") diff --git a/smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/integration/Plugin.kt b/smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/integration/Plugin.kt index 5b59811dd..3e6a87498 100644 --- a/smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/integration/Plugin.kt +++ b/smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/integration/Plugin.kt @@ -8,8 +8,8 @@ interface Plugin { val isDefault: Boolean get() = false - fun customInitialization(writer: SwiftWriter) { - writer.writeInline("\$N()", className) + fun customInitialization(writer: SwiftWriter): String { + return writer.format("\$N()", className) } fun render(ctx: ProtocolGenerator.GenerationContext, writer: SwiftWriter) { From e8e8578f9377b356895090b99dcc0f81538500a2 Mon Sep 17 00:00:00 2001 From: Josh Elkins Date: Thu, 6 Feb 2025 12:16:48 -0600 Subject: [PATCH 2/6] Change config object to value type / structure --- Sources/ClientRuntime/Client/Client.swift | 2 ++ .../ClientRuntime/Client/ClientBuilder.swift | 6 +++--- .../Config/DefaultClientConfiguration.swift | 2 +- .../DefaultHttpClientConfiguration.swift | 2 +- .../Plugins/AuthSchemePlugin.swift | 12 +++++------ .../Plugins/DefaultClientPlugin.swift | 21 +++++++------------ .../Plugins/HttpClientPlugin.swift | 10 +++------ Sources/ClientRuntime/Plugins/Plugin.swift | 2 +- .../ClientRuntime/Plugins/RetryPlugin.swift | 6 ++---- .../Plugins/TelemetryPlugin.swift | 6 ++---- .../config/DefaultClientConfiguration.kt | 1 + .../config/DefaultHttpClientConfiguration.kt | 1 + .../integration/HttpProtocolServiceClient.kt | 8 +++---- .../smithy/swift/codegen/lang/Function.kt | 12 ++++++++++- 14 files changed, 45 insertions(+), 46 deletions(-) diff --git a/Sources/ClientRuntime/Client/Client.swift b/Sources/ClientRuntime/Client/Client.swift index 424d580fe..f0441a1d1 100644 --- a/Sources/ClientRuntime/Client/Client.swift +++ b/Sources/ClientRuntime/Client/Client.swift @@ -4,7 +4,9 @@ // // SPDX-License-Identifier: Apache-2.0 // + public protocol Client { associatedtype Config: ClientConfiguration + init(config: Config) } diff --git a/Sources/ClientRuntime/Client/ClientBuilder.swift b/Sources/ClientRuntime/Client/ClientBuilder.swift index ddcdd458a..2124d5ffc 100644 --- a/Sources/ClientRuntime/Client/ClientBuilder.swift +++ b/Sources/ClientRuntime/Client/ClientBuilder.swift @@ -10,8 +10,8 @@ public class ClientBuilder { private struct PluginContainer: Plugin { let plugin: any Plugin - func configureClient(clientConfiguration: ClientType.Config) async throws -> ClientType.Config { - try await plugin.configureClient(clientConfiguration: clientConfiguration) + func configureClient(clientConfiguration: inout ClientType.Config) async throws { + try await plugin.configureClient(clientConfiguration: &clientConfiguration) } } @@ -32,7 +32,7 @@ public class ClientBuilder { private func resolve() async throws -> ClientType.Config { var config = try await ClientType.Config() for plugin in plugins { - config = try await plugin.configureClient(clientConfiguration: config) + try await plugin.configureClient(clientConfiguration: &config) } return config } diff --git a/Sources/ClientRuntime/Config/DefaultClientConfiguration.swift b/Sources/ClientRuntime/Config/DefaultClientConfiguration.swift index 399878c9c..de5d9e981 100644 --- a/Sources/ClientRuntime/Config/DefaultClientConfiguration.swift +++ b/Sources/ClientRuntime/Config/DefaultClientConfiguration.swift @@ -34,7 +34,7 @@ public protocol DefaultClientConfiguration: ClientConfiguration { /// Adds an `InterceptorProvider` that will be used to provide interceptors for all operations. /// /// - Parameter provider: The `InterceptorProvider` to add. - func addInterceptorProvider(_ provider: InterceptorProvider) + mutating func addInterceptorProvider(_ provider: InterceptorProvider) /// TODO(plugins): Add Checksum, etc. } diff --git a/Sources/ClientRuntime/Config/DefaultHttpClientConfiguration.swift b/Sources/ClientRuntime/Config/DefaultHttpClientConfiguration.swift index 5b390a4e5..f53554917 100644 --- a/Sources/ClientRuntime/Config/DefaultHttpClientConfiguration.swift +++ b/Sources/ClientRuntime/Config/DefaultHttpClientConfiguration.swift @@ -39,5 +39,5 @@ public protocol DefaultHttpClientConfiguration: ClientConfiguration { /// Adds a `HttpInterceptorProvider` that will be used to provide interceptors for all HTTP operations. /// /// - Parameter provider: The `HttpInterceptorProvider` to add. - func addInterceptorProvider(_ provider: HttpInterceptorProvider) + mutating func addInterceptorProvider(_ provider: HttpInterceptorProvider) } diff --git a/Sources/ClientRuntime/Plugins/AuthSchemePlugin.swift b/Sources/ClientRuntime/Plugins/AuthSchemePlugin.swift index 921a2b53b..4540cc02d 100644 --- a/Sources/ClientRuntime/Plugins/AuthSchemePlugin.swift +++ b/Sources/ClientRuntime/Plugins/AuthSchemePlugin.swift @@ -21,14 +21,12 @@ public class AuthSchemePlugin: Plugin { self.authSchemes = authSchemes } - public func configureClient(clientConfiguration: Config) -> Config { - var copy = clientConfiguration - if self.authSchemes != nil { - copy.authSchemes = self.authSchemes! + public func configureClient(clientConfiguration: inout Config) { + if let authSchemes { + clientConfiguration.authSchemes = authSchemes } - if self.authSchemeResolver != nil { - copy.authSchemeResolver = self.authSchemeResolver! + if let authSchemeResolver { + clientConfiguration.authSchemeResolver = authSchemeResolver } - return copy } } diff --git a/Sources/ClientRuntime/Plugins/DefaultClientPlugin.swift b/Sources/ClientRuntime/Plugins/DefaultClientPlugin.swift index 4627cfa0f..5b35940de 100644 --- a/Sources/ClientRuntime/Plugins/DefaultClientPlugin.swift +++ b/Sources/ClientRuntime/Plugins/DefaultClientPlugin.swift @@ -8,21 +8,16 @@ import struct SmithyRetries.DefaultRetryStrategy public class DefaultClientPlugin: Plugin { + typealias DefaultRuntimeConfig = DefaultSDKRuntimeConfiguration public init() {} - public func configureClient(clientConfiguration: Config) async throws -> Config { - var copy = clientConfiguration - copy.retryStrategyOptions = - DefaultSDKRuntimeConfiguration - .defaultRetryStrategyOptions - let httpClientConfiguration = - DefaultSDKRuntimeConfiguration - .defaultHttpClientConfiguration - copy.httpClientConfiguration = httpClientConfiguration - copy.httpClientEngine = - DefaultSDKRuntimeConfiguration - .makeClient(httpClientConfiguration: httpClientConfiguration) - return copy + public func configureClient(clientConfiguration: inout Config) async throws { + clientConfiguration.retryStrategyOptions = DefaultRuntimeConfig.defaultRetryStrategyOptions + let httpClientConfiguration = DefaultRuntimeConfig .defaultHttpClientConfiguration + clientConfiguration.httpClientConfiguration = httpClientConfiguration + clientConfiguration.httpClientEngine = DefaultRuntimeConfig.makeClient( + httpClientConfiguration: httpClientConfiguration + ) } } diff --git a/Sources/ClientRuntime/Plugins/HttpClientPlugin.swift b/Sources/ClientRuntime/Plugins/HttpClientPlugin.swift index 880614dd3..620eba4af 100644 --- a/Sources/ClientRuntime/Plugins/HttpClientPlugin.swift +++ b/Sources/ClientRuntime/Plugins/HttpClientPlugin.swift @@ -9,9 +9,7 @@ import protocol SmithyHTTPAPI.HTTPClient import struct SmithyRetries.DefaultRetryStrategy public class DefaultHttpClientPlugin: Plugin { - var httpClientConfiguration: HttpClientConfiguration - var httpClient: HTTPClient public init(httpClient: HTTPClient, httpClientConfiguration: HttpClientConfiguration) { @@ -27,10 +25,8 @@ public class DefaultHttpClientPlugin: Pl ) } - public func configureClient(clientConfiguration: Config) -> Config { - var copy = clientConfiguration - copy.httpClientConfiguration = self.httpClientConfiguration - copy.httpClientEngine = self.httpClient - return copy + public func configureClient(clientConfiguration: inout Config) { + clientConfiguration.httpClientConfiguration = self.httpClientConfiguration + clientConfiguration.httpClientEngine = self.httpClient } } diff --git a/Sources/ClientRuntime/Plugins/Plugin.swift b/Sources/ClientRuntime/Plugins/Plugin.swift index e85bab8e9..b6c3969b5 100644 --- a/Sources/ClientRuntime/Plugins/Plugin.swift +++ b/Sources/ClientRuntime/Plugins/Plugin.swift @@ -8,5 +8,5 @@ public protocol Plugin { associatedtype Config: ClientConfiguration - func configureClient(clientConfiguration: Config) async throws -> Config + func configureClient(clientConfiguration: inout Config) async throws } diff --git a/Sources/ClientRuntime/Plugins/RetryPlugin.swift b/Sources/ClientRuntime/Plugins/RetryPlugin.swift index bbc740e83..9b04508c7 100644 --- a/Sources/ClientRuntime/Plugins/RetryPlugin.swift +++ b/Sources/ClientRuntime/Plugins/RetryPlugin.swift @@ -15,9 +15,7 @@ public class RetryPlugin: Plugin { self.retryStrategyOptions = retryStrategyOptions } - public func configureClient(clientConfiguration: Config) -> Config { - var copy = clientConfiguration - copy.retryStrategyOptions = self.retryStrategyOptions - return copy + public func configureClient(clientConfiguration: inout Config) { + clientConfiguration.retryStrategyOptions = self.retryStrategyOptions } } diff --git a/Sources/ClientRuntime/Plugins/TelemetryPlugin.swift b/Sources/ClientRuntime/Plugins/TelemetryPlugin.swift index a0196e783..ea368b257 100644 --- a/Sources/ClientRuntime/Plugins/TelemetryPlugin.swift +++ b/Sources/ClientRuntime/Plugins/TelemetryPlugin.swift @@ -27,10 +27,8 @@ public class TelemetryPlugin: Plugin { ) } - public func configureClient(clientConfiguration: Config) -> Config { - var copy = clientConfiguration - copy.telemetryProvider = self.telemetryProvider - return copy + public func configureClient(clientConfiguration: inout Config) { + clientConfiguration.telemetryProvider = self.telemetryProvider } } diff --git a/smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/config/DefaultClientConfiguration.kt b/smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/config/DefaultClientConfiguration.kt index 39dce4895..e9d93714f 100644 --- a/smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/config/DefaultClientConfiguration.kt +++ b/smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/config/DefaultClientConfiguration.kt @@ -55,6 +55,7 @@ class DefaultClientConfiguration : ClientConfiguration { parameters = listOf( FunctionParameter.NoLabel("provider", ClientRuntimeTypes.Core.InterceptorProvider) ), + isMutating = true, ) ) } diff --git a/smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/config/DefaultHttpClientConfiguration.kt b/smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/config/DefaultHttpClientConfiguration.kt index d478e186f..d6c0b6feb 100644 --- a/smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/config/DefaultHttpClientConfiguration.kt +++ b/smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/config/DefaultHttpClientConfiguration.kt @@ -62,6 +62,7 @@ class DefaultHttpClientConfiguration : ClientConfiguration { parameters = listOf( FunctionParameter.NoLabel("provider", ClientRuntimeTypes.Core.HttpInterceptorProvider) ), + isMutating = true, ) ) } diff --git a/smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/integration/HttpProtocolServiceClient.kt b/smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/integration/HttpProtocolServiceClient.kt index 5df9ca5d1..e4ddaccd1 100644 --- a/smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/integration/HttpProtocolServiceClient.kt +++ b/smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/integration/HttpProtocolServiceClient.kt @@ -108,7 +108,7 @@ open class HttpProtocolServiceClient( .joinToString(" & ") writer.openBlock( - "public class \$LConfiguration: \$L {", "}", + "public struct \$LConfiguration: \$L {", "}", serviceConfig.clientName.toUpperCamelCase(), clientConfigurationProtocols ) { @@ -151,7 +151,7 @@ open class HttpProtocolServiceClient( } private fun renderEmptyAsynchronousConfigInitializer(properties: List) { - writer.openBlock("public convenience required init() async throws {", "}") { + writer.openBlock("public init() async throws {", "}") { writer.openBlock("try await self.init(", ")") { properties.forEach { property -> writer.write("\$L: nil,", property.name) @@ -204,7 +204,7 @@ open class HttpProtocolServiceClient( } private fun renderSynchronousConfigInitializer(properties: List) { - writer.openBlock("public convenience init(", ") throws {") { + writer.openBlock("public init(", ") throws {") { properties.forEach { property -> writer.write("\$L: \$N = nil,", property.name, property.type.toOptional()) } @@ -231,7 +231,7 @@ open class HttpProtocolServiceClient( private fun renderAsynchronousConfigInitializer(properties: List) { if (properties.none { it.default?.isAsync == true }) return - writer.openBlock("public convenience init(", ") async throws {") { + writer.openBlock("public init(", ") async throws {") { properties.forEach { property -> writer.write("\$L: \$L = nil,", property.name, property.type.toOptional().renderSwiftType(writer)) } diff --git a/smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/lang/Function.kt b/smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/lang/Function.kt index 2e872f343..f7d0f0a59 100644 --- a/smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/lang/Function.kt +++ b/smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/lang/Function.kt @@ -20,17 +20,27 @@ data class Function( val accessModifier: AccessModifier = AccessModifier.Public, val isAsync: Boolean = false, val isThrowing: Boolean = false, + val isMutating: Boolean = false, ) { /** * Render this function using the given writer. */ fun render(writer: SwiftWriter) { + val renderedMutating = "mutating ".takeIf { isMutating } ?: "" val renderedParameters = parameters.joinToString(", ") { it.rendered(writer) } val renderedAsync = if (isAsync) "async " else "" val renderedThrows = if (isThrowing) "throws " else "" val renderedReturnType = returnType?.let { writer.format("-> \$N ", it) } ?: "" - writer.openBlock("${accessModifier.renderedRightPad()}func $name($renderedParameters) $renderedAsync$renderedThrows$renderedReturnType{", "}") { + writer.openBlock( + "\$L\$Lfunc \$L(\$L) \$L$renderedThrows$renderedReturnType{", + "}", + accessModifier.renderedRightPad(), + renderedMutating, + name, + renderedParameters, + renderedAsync, + ) { renderBody.accept(writer) } } From 7f6e6193fccefff99c14ca13a92996e23bf36ee5 Mon Sep 17 00:00:00 2001 From: Josh Elkins Date: Thu, 6 Feb 2025 13:53:56 -0600 Subject: [PATCH 3/6] Fix tests --- .../codegen/HttpProtocolClientGeneratorTests.kt | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/smithy-swift-codegen/src/test/kotlin/software/amazon/smithy/swift/codegen/HttpProtocolClientGeneratorTests.kt b/smithy-swift-codegen/src/test/kotlin/software/amazon/smithy/swift/codegen/HttpProtocolClientGeneratorTests.kt index a7ed9b185..80fccb034 100644 --- a/smithy-swift-codegen/src/test/kotlin/software/amazon/smithy/swift/codegen/HttpProtocolClientGeneratorTests.kt +++ b/smithy-swift-codegen/src/test/kotlin/software/amazon/smithy/swift/codegen/HttpProtocolClientGeneratorTests.kt @@ -38,7 +38,7 @@ public class RestJsonProtocolClient: ClientRuntime.Client { extension RestJsonProtocolClient { - public class RestJsonProtocolClientConfiguration: ClientRuntime.DefaultClientConfiguration & ClientRuntime.DefaultHttpClientConfiguration { + public struct RestJsonProtocolClientConfiguration: ClientRuntime.DefaultClientConfiguration & ClientRuntime.DefaultHttpClientConfiguration { public var telemetryProvider: ClientRuntime.TelemetryProvider public var retryStrategyOptions: SmithyRetriesAPI.RetryStrategyOptions public var clientLogMode: ClientRuntime.ClientLogMode @@ -80,7 +80,7 @@ extension RestJsonProtocolClient { self.httpInterceptorProviders = httpInterceptorProviders } - public convenience init( + public init( telemetryProvider: ClientRuntime.TelemetryProvider? = nil, retryStrategyOptions: SmithyRetriesAPI.RetryStrategyOptions? = nil, clientLogMode: ClientRuntime.ClientLogMode? = nil, @@ -110,7 +110,7 @@ extension RestJsonProtocolClient { ) } - public convenience required init() async throws { + public init() async throws { try await self.init( telemetryProvider: nil, retryStrategyOptions: nil, @@ -131,20 +131,19 @@ extension RestJsonProtocolClient { return "" } - 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() - ]) + return ClientRuntime.ClientBuilder() + .withPlugin(ClientRuntime.DefaultClientPlugin()) } } """ From 8230ec37977fbc099d6ba70a419421010202d0f1 Mon Sep 17 00:00:00 2001 From: Josh Elkins Date: Thu, 6 Feb 2025 17:20:59 -0600 Subject: [PATCH 4/6] Fix ktlint --- .../amazon/smithy/swift/codegen/integration/Plugin.kt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/integration/Plugin.kt b/smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/integration/Plugin.kt index 13848c635..c7e073ab8 100644 --- a/smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/integration/Plugin.kt +++ b/smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/integration/Plugin.kt @@ -8,9 +8,7 @@ interface Plugin { val isDefault: Boolean get() = false - fun customInitialization(writer: SwiftWriter): String { - return writer.format("\$N()", className) - } + fun customInitialization(writer: SwiftWriter): String = writer.format("\$N()", className) fun render( ctx: ProtocolGenerator.GenerationContext, From 4437d7a912a8ee6291bc26d60e544822b19b6d90 Mon Sep 17 00:00:00 2001 From: Josh Elkins Date: Thu, 6 Feb 2025 17:33:26 -0600 Subject: [PATCH 5/6] Fix code after merge --- .../smithy/swift/codegen/config/DefaultClientConfiguration.kt | 4 ++-- .../swift/codegen/config/DefaultHttpClientConfiguration.kt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/config/DefaultClientConfiguration.kt b/smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/config/DefaultClientConfiguration.kt index 30c5a141d..5786c8b4f 100644 --- a/smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/config/DefaultClientConfiguration.kt +++ b/smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/config/DefaultClientConfiguration.kt @@ -58,7 +58,7 @@ class DefaultClientConfiguration : ClientConfiguration { listOf( FunctionParameter.NoLabel("provider", ClientRuntimeTypes.Core.InterceptorProvider), ), - ), - isMutating = true, + isMutating = true, + ), ) } diff --git a/smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/config/DefaultHttpClientConfiguration.kt b/smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/config/DefaultHttpClientConfiguration.kt index f845e3b27..542287cba 100644 --- a/smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/config/DefaultHttpClientConfiguration.kt +++ b/smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/config/DefaultHttpClientConfiguration.kt @@ -74,7 +74,7 @@ class DefaultHttpClientConfiguration : ClientConfiguration { listOf( FunctionParameter.NoLabel("provider", ClientRuntimeTypes.Core.HttpInterceptorProvider), ), - ), - isMutating = true, + isMutating = true, + ), ) } From 04baddf1fb10d6258ef14761fe8bef70d853d625 Mon Sep 17 00:00:00 2001 From: Josh Elkins Date: Thu, 6 Feb 2025 17:43:50 -0600 Subject: [PATCH 6/6] ktlint fix --- .../smithy/swift/codegen/config/DefaultClientConfiguration.kt | 2 +- .../swift/codegen/config/DefaultHttpClientConfiguration.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/config/DefaultClientConfiguration.kt b/smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/config/DefaultClientConfiguration.kt index 5786c8b4f..f756daa9f 100644 --- a/smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/config/DefaultClientConfiguration.kt +++ b/smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/config/DefaultClientConfiguration.kt @@ -59,6 +59,6 @@ class DefaultClientConfiguration : ClientConfiguration { FunctionParameter.NoLabel("provider", ClientRuntimeTypes.Core.InterceptorProvider), ), isMutating = true, - ), + ), ) } diff --git a/smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/config/DefaultHttpClientConfiguration.kt b/smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/config/DefaultHttpClientConfiguration.kt index 542287cba..a88e1c776 100644 --- a/smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/config/DefaultHttpClientConfiguration.kt +++ b/smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/config/DefaultHttpClientConfiguration.kt @@ -75,6 +75,6 @@ class DefaultHttpClientConfiguration : ClientConfiguration { FunctionParameter.NoLabel("provider", ClientRuntimeTypes.Core.HttpInterceptorProvider), ), isMutating = true, - ), + ), ) }