Skip to content

Commit 0744f70

Browse files
authored
feat: add sync client and config init overloads when providing regions (#569)
1 parent 16f678a commit 0744f70

File tree

3 files changed

+154
-39
lines changed

3 files changed

+154
-39
lines changed

codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/AWSHttpProtocolServiceClient.kt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
package software.amazon.smithy.aws.swift.codegen
77

88
import software.amazon.smithy.codegen.core.Symbol
9-
import software.amazon.smithy.swift.codegen.SwiftTypes
109
import software.amazon.smithy.swift.codegen.SwiftWriter
1110
import software.amazon.smithy.swift.codegen.integration.ClientProperty
1211
import software.amazon.smithy.swift.codegen.integration.HttpProtocolServiceClient
@@ -20,8 +19,13 @@ class AWSHttpProtocolServiceClient(
2019
private val serviceConfig: ServiceConfig
2120
) : HttpProtocolServiceClient(ctx, writer, properties, serviceConfig) {
2221
override fun renderConvenienceInit(serviceSymbol: Symbol) {
23-
writer.openBlock("public convenience init(region: \$D) async throws {", "}", SwiftTypes.String) {
24-
writer.write("let config = try await ${serviceConfig.typeName}(region: region)")
22+
writer.openBlock("public convenience init(region: Swift.String) throws {", "}") {
23+
writer.write("let config = try ${serviceConfig.typeName}(region: region)")
24+
writer.write("self.init(config: config)")
25+
}
26+
writer.write("")
27+
writer.openBlock("public convenience init() async throws {", "}") {
28+
writer.write("let config = try await ${serviceConfig.typeName}()")
2529
writer.write("self.init(config: config)")
2630
}
2731
}

codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/AWSServiceConfig.kt

Lines changed: 95 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -24,35 +24,71 @@ class AWSServiceConfig(writer: SwiftWriter, serviceName: String) : ServiceConfig
2424
get() = listOf(AWSClientRuntimeTypes.Core.AWSClientConfiguration)
2525

2626
override fun renderInitializers(serviceSymbol: Symbol) {
27-
val awsConfigFields = otherRuntimeConfigProperties()
28-
writer.openBlock("public init(", ") async throws {") {
29-
awsConfigFields.forEach {
27+
val runtimeTimeConfigFields = sdkRuntimeConfigProperties()
28+
29+
val awsSyncConfigFields = syncRuntimeConfigProperties()
30+
31+
writer.openBlock("public init(", ") throws {") {
32+
writer.write("region: Swift.String,")
33+
awsSyncConfigFields.forEach {
3034
writer.write("${it.memberName}: \$D, ", it.type)
3135
}
3236
writer.write("runtimeConfig: \$N", ClientRuntimeTypes.Core.SDKRuntimeConfiguration)
3337
}
3438
writer.indent()
35-
writer.openBlock("if let region = region {", "} else {") {
36-
writer.write("self.region = region")
37-
writer.write("self.regionResolver = nil")
38-
writer.write("self.signingRegion = signingRegion ?? region")
39+
writer.write("self.region = region")
40+
writer.write("self.signingRegion = signingRegion ?? region")
41+
writer.write("self.endpointResolver = endpointResolver ?? DefaultEndpointResolver()")
42+
writer.openBlock("if let credProvider = credentialsProvider {", "} else {") {
43+
writer.write("self.credentialsProvider = try \$N.fromCustom(credProvider)", AWSClientRuntimeTypes.Core.AWSCredentialsProvider)
44+
}
45+
writer.indent().write("self.credentialsProvider = try \$N.fromChain()", AWSClientRuntimeTypes.Core.AWSCredentialsProvider)
46+
writer.dedent().write("}")
47+
writer.write("self.frameworkMetadata = frameworkMetadata")
48+
runtimeTimeConfigFields.forEach {
49+
writer.write("self.${it.memberName} = runtimeConfig.${it.memberName}")
50+
}
51+
writer.dedent().write("}")
52+
writer.write("")
53+
54+
writer.openBlock("public convenience init(", ") throws {") {
55+
writer.write("region: Swift.String,")
56+
awsSyncConfigFields.forEachIndexed { index, configField ->
57+
val terminator = if (index != awsSyncConfigFields.lastIndex) ", " else ""
58+
writer.write("${configField.memberName}: \$D$terminator", configField.type)
59+
}
60+
}
61+
var syncConfigParamValues = "region: region, "
62+
awsSyncConfigFields.forEach {
63+
syncConfigParamValues += "${it.memberName}: ${it.memberName}, "
64+
}
65+
66+
writer.indent()
67+
writer.write("let defaultRuntimeConfig = try \$N(\"${serviceName}\")", ClientRuntimeTypes.Core.DefaultSDKRuntimeConfiguration)
68+
writer.write("try self.init(${syncConfigParamValues}runtimeConfig: defaultRuntimeConfig)")
69+
writer.dedent().write("}")
70+
writer.write("")
71+
72+
val awsAsyncConfigFields = asyncRuntimeConfigProperties()
73+
74+
writer.openBlock("public init(", ") async throws {") {
75+
awsAsyncConfigFields.forEach {
76+
writer.write("${it.memberName}: \$D, ", it.type)
77+
}
78+
writer.write("runtimeConfig: \$N", ClientRuntimeTypes.Core.SDKRuntimeConfiguration)
3979
}
4080
writer.indent()
4181
writer.write("let resolvedRegionResolver = regionResolver ?? DefaultRegionResolver()")
42-
writer.write("let region = await resolvedRegionResolver.resolveRegion()")
43-
writer.write("self.region = region")
82+
writer.write("self.region = await resolvedRegionResolver.resolveRegion()")
4483
writer.write("self.regionResolver = resolvedRegionResolver")
4584
writer.write("self.signingRegion = signingRegion ?? region")
46-
writer.dedent()
47-
writer.write("}")
4885
writer.write("self.endpointResolver = endpointResolver ?? DefaultEndpointResolver()")
4986
writer.openBlock("if let credProvider = credentialsProvider {", "} else {") {
5087
writer.write("self.credentialsProvider = try \$N.fromCustom(credProvider)", AWSClientRuntimeTypes.Core.AWSCredentialsProvider)
5188
}
5289
writer.indent().write("self.credentialsProvider = try \$N.fromChain()", AWSClientRuntimeTypes.Core.AWSCredentialsProvider)
5390
writer.dedent().write("}")
5491
writer.write("self.frameworkMetadata = frameworkMetadata")
55-
val runtimeTimeConfigFields = sdkRuntimeConfigProperties()
5692
runtimeTimeConfigFields.forEach {
5793
writer.write("self.${it.memberName} = runtimeConfig.${it.memberName}")
5894
}
@@ -61,22 +97,63 @@ class AWSServiceConfig(writer: SwiftWriter, serviceName: String) : ServiceConfig
6197

6298
writer.openBlock("public convenience init(", ") async throws {") {
6399

64-
awsConfigFields.forEachIndexed { index, configField ->
65-
val terminator = if (index != awsConfigFields.lastIndex) ", " else ""
100+
awsAsyncConfigFields.forEachIndexed { index, configField ->
101+
val terminator = if (index != awsAsyncConfigFields.lastIndex) ", " else ""
66102
writer.write("${configField.memberName}: \$D$terminator", configField.type)
67103
}
68104
}
69105

70-
var configParamValues = ""
71-
awsConfigFields.forEach {
72-
configParamValues += "${it.memberName}: ${it.memberName}, "
106+
var asyncConfigParamValues = ""
107+
awsAsyncConfigFields.forEach {
108+
asyncConfigParamValues += "${it.memberName}: ${it.memberName}, "
73109
}
74110
writer.indent()
75111
writer.write("let defaultRuntimeConfig = try \$N(\"${serviceName}\")", ClientRuntimeTypes.Core.DefaultSDKRuntimeConfiguration)
76-
writer.write("try await self.init(${configParamValues}runtimeConfig: defaultRuntimeConfig)")
112+
writer.write("try await self.init(${asyncConfigParamValues}runtimeConfig: defaultRuntimeConfig)")
77113
writer.dedent().write("}")
78114
}
79115

116+
fun syncRuntimeConfigProperties(): List<ConfigField> {
117+
return listOf(
118+
ConfigField(
119+
CREDENTIALS_PROVIDER_CONFIG_NAME, AWSClientRuntimeTypes.Core.CredentialsProvider,
120+
documentation = "The credentials provider to use to authenticate requests."
121+
),
122+
ConfigField(
123+
ENDPOINT_RESOLVER, AWSClientRuntimeTypes.Core.EndpointResolver,
124+
documentation = "The endpoint resolver used to resolve endpoints."
125+
),
126+
ConfigField(
127+
FRAMEWORK_METADATA,
128+
AWSClientRuntimeTypes.Core.FrameworkMetadata,
129+
formatter = "\$T",
130+
documentation = "Contains information to inject lib/ into user-agent"
131+
),
132+
ConfigField(SIGNING_REGION_CONFIG_NAME, SwiftTypes.String, "\$T", "The region to sign requests in. (Required)")
133+
).sortedBy { it.memberName }
134+
}
135+
136+
fun asyncRuntimeConfigProperties(): List<ConfigField> {
137+
return listOf(
138+
ConfigField(
139+
CREDENTIALS_PROVIDER_CONFIG_NAME, AWSClientRuntimeTypes.Core.CredentialsProvider,
140+
documentation = "The credentials provider to use to authenticate requests."
141+
),
142+
ConfigField(
143+
ENDPOINT_RESOLVER, AWSClientRuntimeTypes.Core.EndpointResolver,
144+
documentation = "The endpoint resolver used to resolve endpoints."
145+
),
146+
ConfigField(
147+
FRAMEWORK_METADATA,
148+
AWSClientRuntimeTypes.Core.FrameworkMetadata,
149+
formatter = "\$T",
150+
documentation = "Contains information to inject lib/ into user-agent"
151+
),
152+
ConfigField(REGION_RESOLVER, AWSClientRuntimeTypes.Core.RegionResolver, "\$T", documentation = "The region resolver uses an array of region providers to resolve the region."),
153+
ConfigField(SIGNING_REGION_CONFIG_NAME, SwiftTypes.String, "\$T", "The region to sign requests in. (Required)")
154+
).sortedBy { it.memberName }
155+
}
156+
80157
override fun otherRuntimeConfigProperties(): List<ConfigField> {
81158
return listOf(
82159
ConfigField(

codegen/smithy-aws-swift-codegen/src/test/kotlin/software/amazon/smithy/aws/swift/codegen/RestJsonProtocolGeneratorTests.kt

Lines changed: 52 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -97,11 +97,16 @@ class RestJsonProtocolGeneratorTests {
9797
self.config = config
9898
}
9999
100-
public convenience init(region: Swift.String? = nil) async throws {
101-
let config = try await ExampleClientConfiguration(region: region)
100+
public convenience init(region: Swift.String) throws {
101+
let config = try ExampleClientConfiguration(region: region)
102102
self.init(config: config)
103103
}
104-
104+
105+
public convenience init() async throws {
106+
let config = try await ExampleClientConfiguration()
107+
self.init(config: config)
108+
}
109+
105110
deinit {
106111
client.close()
107112
}
@@ -123,27 +128,57 @@ class RestJsonProtocolGeneratorTests {
123128
public var region: Swift.String?
124129
public var regionResolver: AWSClientRuntime.RegionResolver?
125130
public var signingRegion: Swift.String?
126-
131+
127132
public init(
133+
region: Swift.String,
128134
credentialsProvider: AWSClientRuntime.CredentialsProvider? = nil,
129135
endpointResolver: AWSClientRuntime.EndpointResolver? = nil,
130136
frameworkMetadata: AWSClientRuntime.FrameworkMetadata? = nil,
131-
region: Swift.String? = nil,
132-
regionResolver: AWSClientRuntime.RegionResolver? = nil,
133137
signingRegion: Swift.String? = nil,
134138
runtimeConfig: ClientRuntime.SDKRuntimeConfiguration
135-
) async throws {
136-
if let region = region {
137-
self.region = region
138-
self.regionResolver = nil
139-
self.signingRegion = signingRegion ?? region
139+
) throws {
140+
self.region = region
141+
self.signingRegion = signingRegion ?? region
142+
self.endpointResolver = endpointResolver ?? DefaultEndpointResolver()
143+
if let credProvider = credentialsProvider {
144+
self.credentialsProvider = try AWSClientRuntime.AWSCredentialsProvider.fromCustom(credProvider)
140145
} else {
141-
let resolvedRegionResolver = regionResolver ?? DefaultRegionResolver()
142-
let region = await resolvedRegionResolver.resolveRegion()
143-
self.region = region
144-
self.regionResolver = resolvedRegionResolver
145-
self.signingRegion = signingRegion ?? region
146+
self.credentialsProvider = try AWSClientRuntime.AWSCredentialsProvider.fromChain()
146147
}
148+
self.frameworkMetadata = frameworkMetadata
149+
self.clientLogMode = runtimeConfig.clientLogMode
150+
self.decoder = runtimeConfig.decoder
151+
self.encoder = runtimeConfig.encoder
152+
self.httpClientConfiguration = runtimeConfig.httpClientConfiguration
153+
self.httpClientEngine = runtimeConfig.httpClientEngine
154+
self.idempotencyTokenGenerator = runtimeConfig.idempotencyTokenGenerator
155+
self.logger = runtimeConfig.logger
156+
self.retryer = runtimeConfig.retryer
157+
}
158+
159+
public convenience init(
160+
region: Swift.String,
161+
credentialsProvider: AWSClientRuntime.CredentialsProvider? = nil,
162+
endpointResolver: AWSClientRuntime.EndpointResolver? = nil,
163+
frameworkMetadata: AWSClientRuntime.FrameworkMetadata? = nil,
164+
signingRegion: Swift.String? = nil
165+
) throws {
166+
let defaultRuntimeConfig = try ClientRuntime.DefaultSDKRuntimeConfiguration("ExampleClient")
167+
try self.init(region: region, credentialsProvider: credentialsProvider, endpointResolver: endpointResolver, frameworkMetadata: frameworkMetadata, signingRegion: signingRegion, runtimeConfig: defaultRuntimeConfig)
168+
}
169+
170+
public init(
171+
credentialsProvider: AWSClientRuntime.CredentialsProvider? = nil,
172+
endpointResolver: AWSClientRuntime.EndpointResolver? = nil,
173+
frameworkMetadata: AWSClientRuntime.FrameworkMetadata? = nil,
174+
regionResolver: AWSClientRuntime.RegionResolver? = nil,
175+
signingRegion: Swift.String? = nil,
176+
runtimeConfig: ClientRuntime.SDKRuntimeConfiguration
177+
) async throws {
178+
let resolvedRegionResolver = regionResolver ?? DefaultRegionResolver()
179+
self.region = await resolvedRegionResolver.resolveRegion()
180+
self.regionResolver = resolvedRegionResolver
181+
self.signingRegion = signingRegion ?? region
147182
self.endpointResolver = endpointResolver ?? DefaultEndpointResolver()
148183
if let credProvider = credentialsProvider {
149184
self.credentialsProvider = try AWSClientRuntime.AWSCredentialsProvider.fromCustom(credProvider)
@@ -165,12 +200,11 @@ class RestJsonProtocolGeneratorTests {
165200
credentialsProvider: AWSClientRuntime.CredentialsProvider? = nil,
166201
endpointResolver: AWSClientRuntime.EndpointResolver? = nil,
167202
frameworkMetadata: AWSClientRuntime.FrameworkMetadata? = nil,
168-
region: Swift.String? = nil,
169203
regionResolver: AWSClientRuntime.RegionResolver? = nil,
170204
signingRegion: Swift.String? = nil
171205
) async throws {
172206
let defaultRuntimeConfig = try ClientRuntime.DefaultSDKRuntimeConfiguration("ExampleClient")
173-
try await self.init(credentialsProvider: credentialsProvider, endpointResolver: endpointResolver, frameworkMetadata: frameworkMetadata, region: region, regionResolver: regionResolver, signingRegion: signingRegion, runtimeConfig: defaultRuntimeConfig)
207+
try await self.init(credentialsProvider: credentialsProvider, endpointResolver: endpointResolver, frameworkMetadata: frameworkMetadata, regionResolver: regionResolver, signingRegion: signingRegion, runtimeConfig: defaultRuntimeConfig)
174208
}
175209
}
176210
}

0 commit comments

Comments
 (0)