Skip to content

Commit 71b401f

Browse files
authored
Move endpoint module and add endpoint re-exports (#2822)
All the types in the `crate::endpoint` module are related to endpoint configuration, so they should be moved into `crate::config::endpoint` to be consistent with the rest of the generated crate organization. This PR moves them for the orchestrator implementation, but retains them in `crate::endpoint` when generating for middleware. ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._
1 parent ac95a5d commit 71b401f

File tree

9 files changed

+68
-30
lines changed

9 files changed

+68
-30
lines changed

codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustModule.kt

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,9 @@ object ClientRustModule {
6060
/** crate::client */
6161
val self = RustModule.public("config")
6262

63+
/** crate::config::endpoint */
64+
val endpoint = RustModule.public("endpoint", parent = self)
65+
6366
/** crate::config::retry */
6467
val retry = RustModule.public("retry", parent = self)
6568

@@ -70,8 +73,18 @@ object ClientRustModule {
7073
val interceptors = RustModule.public("interceptors", parent = self)
7174
}
7275

73-
val Error = RustModule.public("error")
76+
// TODO(enableNewSmithyRuntimeCleanup): Delete this root endpoint module
77+
@Deprecated(message = "use the endpoint() method to get the endpoint module for now")
7478
val Endpoint = RustModule.public("endpoint")
79+
80+
// TODO(enableNewSmithyRuntimeCleanup): Just use Config.endpoint directly and delete this function
81+
fun endpoint(codegenContext: ClientCodegenContext): RustModule.LeafModule = if (codegenContext.smithyRuntimeMode.defaultToMiddleware) {
82+
Endpoint
83+
} else {
84+
Config.endpoint
85+
}
86+
87+
val Error = RustModule.public("error")
7588
val Operation = RustModule.public("operation")
7689
val Meta = RustModule.public("meta")
7790
val Input = RustModule.public("input")
@@ -99,6 +112,7 @@ class ClientModuleDocProvider(
99112
ClientRustModule.client -> clientModuleDoc()
100113
ClientRustModule.Client.customize -> customizeModuleDoc()
101114
ClientRustModule.config -> strDoc("Configuration for $serviceName.")
115+
ClientRustModule.Config.endpoint -> strDoc("Types needed to configure endpoint resolution.")
102116
ClientRustModule.Config.retry -> strDoc("Retry configuration.")
103117
ClientRustModule.Config.timeout -> strDoc("Timeout configuration.")
104118
ClientRustModule.Config.interceptors -> strDoc("Types needed to implement [`Interceptor`](crate::config::Interceptor).")

codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointConfigCustomization.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.pre
1919
* Customization which injects an Endpoints 2.0 Endpoint Resolver into the service config struct
2020
*/
2121
internal class EndpointConfigCustomization(
22-
codegenContext: ClientCodegenContext,
22+
private val codegenContext: ClientCodegenContext,
2323
private val typesGenerator: EndpointTypesGenerator,
2424
) :
2525
ConfigCustomization() {
@@ -86,6 +86,8 @@ internal class EndpointConfigCustomization(
8686
ServiceConfig.BuilderImpl -> {
8787
// if there are no rules, we don't generate a default resolver—we need to also suppress those docs.
8888
val defaultResolverDocs = if (typesGenerator.defaultResolver() != null) {
89+
val endpointModule = ClientRustModule.endpoint(codegenContext).fullyQualifiedPath()
90+
.replace("crate::", "$moduleUseName::")
8991
"""
9092
///
9193
/// When unset, the client will used a generated endpoint resolver based on the endpoint resolution
@@ -94,7 +96,7 @@ internal class EndpointConfigCustomization(
9496
/// ## Examples
9597
/// ```no_run
9698
/// use aws_smithy_http::endpoint;
97-
/// use $moduleUseName::endpoint::{Params as EndpointParams, DefaultResolver};
99+
/// use $endpointModule::{Params as EndpointParams, DefaultResolver};
98100
/// /// Endpoint resolver which adds a prefix to the generated endpoint
99101
/// ##[derive(Debug)]
100102
/// struct PrefixResolver {
@@ -193,7 +195,7 @@ internal class EndpointConfigCustomization(
193195
}
194196
} else {
195197
val alwaysFailsResolver =
196-
RuntimeType.forInlineFun("MissingResolver", ClientRustModule.Endpoint) {
198+
RuntimeType.forInlineFun("MissingResolver", ClientRustModule.endpoint(codegenContext)) {
197199
rustTemplate(
198200
"""
199201
##[derive(Debug)]

codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointTypesGenerator.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,10 @@ class EndpointTypesGenerator(
4040
}
4141
}
4242

43-
fun paramsStruct(): RuntimeType = EndpointParamsGenerator(params).paramsStruct()
44-
fun paramsBuilder(): RuntimeType = EndpointParamsGenerator(params).paramsBuilder()
43+
fun paramsStruct(): RuntimeType = EndpointParamsGenerator(codegenContext, params).paramsStruct()
44+
fun paramsBuilder(): RuntimeType = EndpointParamsGenerator(codegenContext, params).paramsBuilder()
4545
fun defaultResolver(): RuntimeType? =
46-
rules?.let { EndpointResolverGenerator(stdlib, runtimeConfig).defaultEndpointResolver(it) }
46+
rules?.let { EndpointResolverGenerator(codegenContext, stdlib).defaultEndpointResolver(it) }
4747

4848
fun testGenerator(): Writable =
4949
defaultResolver()?.let {

codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecorator.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule
1818
import software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator
1919
import software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.CustomRuntimeFunction
2020
import software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.EndpointParamsGenerator
21-
import software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.EndpointTests
21+
import software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.endpointTestsModule
2222
import software.amazon.smithy.rust.codegen.client.smithy.endpoint.rulesgen.SmithyEndpointsStdLib
2323
import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization
2424
import software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection
@@ -134,8 +134,8 @@ class EndpointsDecorator : ClientCodegenDecorator {
134134

135135
override fun extras(codegenContext: ClientCodegenContext, rustCrate: RustCrate) {
136136
val generator = EndpointTypesGenerator.fromContext(codegenContext)
137-
rustCrate.withModule(ClientRustModule.Endpoint) {
138-
withInlineModule(EndpointTests, rustCrate.moduleDocProvider) {
137+
rustCrate.withModule(ClientRustModule.endpoint(codegenContext)) {
138+
withInlineModule(endpointTestsModule(codegenContext), rustCrate.moduleDocProvider) {
139139
generator.testGenerator()(this)
140140
}
141141
}

codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsGenerator.kt

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ package software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators
88
import software.amazon.smithy.rulesengine.language.eval.Value
99
import software.amazon.smithy.rulesengine.language.syntax.Identifier
1010
import software.amazon.smithy.rulesengine.language.syntax.parameters.Parameters
11+
import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext
1112
import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule
1213
import software.amazon.smithy.rust.codegen.client.smithy.endpoint.memberName
1314
import software.amazon.smithy.rust.codegen.client.smithy.endpoint.rustName
@@ -37,12 +38,12 @@ import software.amazon.smithy.rust.codegen.core.util.dq
3738
import software.amazon.smithy.rust.codegen.core.util.orNull
3839

3940
// internals contains the actual resolver function
40-
val EndpointImpl = RustModule.private("internals", parent = ClientRustModule.Endpoint)
41+
fun endpointImplModule(codegenContext: ClientCodegenContext) = RustModule.private("internals", parent = ClientRustModule.endpoint(codegenContext))
4142

42-
val EndpointTests = RustModule.new(
43+
fun endpointTestsModule(codegenContext: ClientCodegenContext) = RustModule.new(
4344
"test",
4445
visibility = Visibility.PRIVATE,
45-
parent = ClientRustModule.Endpoint,
46+
parent = ClientRustModule.endpoint(codegenContext),
4647
inline = true,
4748
documentationOverride = "",
4849
).cfgTest()
@@ -108,22 +109,24 @@ val EndpointStdLib = RustModule.private("endpoint_lib")
108109
* ```
109110
*/
110111

111-
internal class EndpointParamsGenerator(private val parameters: Parameters) {
112-
112+
internal class EndpointParamsGenerator(
113+
private val codegenContext: ClientCodegenContext,
114+
private val parameters: Parameters,
115+
) {
113116
companion object {
114117
fun memberName(parameterName: String) = Identifier.of(parameterName).rustName()
115118
fun setterName(parameterName: String) = "set_${memberName(parameterName)}"
116119
}
117120

118-
fun paramsStruct(): RuntimeType = RuntimeType.forInlineFun("Params", ClientRustModule.Endpoint) {
121+
fun paramsStruct(): RuntimeType = RuntimeType.forInlineFun("Params", ClientRustModule.endpoint(codegenContext)) {
119122
generateEndpointsStruct(this)
120123
}
121124

122-
internal fun paramsBuilder(): RuntimeType = RuntimeType.forInlineFun("ParamsBuilder", ClientRustModule.Endpoint) {
125+
internal fun paramsBuilder(): RuntimeType = RuntimeType.forInlineFun("ParamsBuilder", ClientRustModule.endpoint(codegenContext)) {
123126
generateEndpointParamsBuilder(this)
124127
}
125128

126-
private fun paramsError(): RuntimeType = RuntimeType.forInlineFun("InvalidParams", ClientRustModule.Endpoint) {
129+
private fun paramsError(): RuntimeType = RuntimeType.forInlineFun("InvalidParams", ClientRustModule.endpoint(codegenContext)) {
127130
rust(
128131
"""
129132
/// An error that occurred during endpoint resolution

codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointResolverGenerator.kt

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import software.amazon.smithy.rulesengine.language.syntax.fn.IsSet
1414
import software.amazon.smithy.rulesengine.language.syntax.rule.Condition
1515
import software.amazon.smithy.rulesengine.language.syntax.rule.Rule
1616
import software.amazon.smithy.rulesengine.language.visit.RuleValueVisitor
17+
import software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext
1718
import software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule
1819
import software.amazon.smithy.rust.codegen.client.smithy.endpoint.Context
1920
import software.amazon.smithy.rust.codegen.client.smithy.endpoint.Types
@@ -33,7 +34,6 @@ import software.amazon.smithy.rust.codegen.core.rustlang.rust
3334
import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate
3435
import software.amazon.smithy.rust.codegen.core.rustlang.toType
3536
import software.amazon.smithy.rust.codegen.core.rustlang.writable
36-
import software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig
3737
import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType
3838
import software.amazon.smithy.rust.codegen.core.util.dq
3939
import software.amazon.smithy.rust.codegen.core.util.orNull
@@ -119,7 +119,11 @@ class FunctionRegistry(private val functions: List<CustomRuntimeFunction>) {
119119
*
120120
*/
121121

122-
internal class EndpointResolverGenerator(stdlib: List<CustomRuntimeFunction>, runtimeConfig: RuntimeConfig) {
122+
internal class EndpointResolverGenerator(
123+
private val codegenContext: ClientCodegenContext,
124+
stdlib: List<CustomRuntimeFunction>,
125+
) {
126+
private val runtimeConfig = codegenContext.runtimeConfig
123127
private val registry: FunctionRegistry = FunctionRegistry(stdlib)
124128
private val types = Types(runtimeConfig)
125129
private val codegenScope = arrayOf(
@@ -164,7 +168,7 @@ internal class EndpointResolverGenerator(stdlib: List<CustomRuntimeFunction>, ru
164168

165169
// Now that we rendered the rules once (and then threw it away) we can see what functions we actually used!
166170
val fnsUsed = registry.fnsUsed()
167-
return RuntimeType.forInlineFun("DefaultResolver", ClientRustModule.Endpoint) {
171+
return RuntimeType.forInlineFun("DefaultResolver", ClientRustModule.endpoint(codegenContext)) {
168172
rustTemplate(
169173
"""
170174
/// The default endpoint resolver
@@ -190,7 +194,7 @@ internal class EndpointResolverGenerator(stdlib: List<CustomRuntimeFunction>, ru
190194
""",
191195
"custom_fields" to fnsUsed.mapNotNull { it.structField() }.join(","),
192196
"custom_fields_init" to fnsUsed.mapNotNull { it.structFieldInit() }.join(","),
193-
"Params" to EndpointParamsGenerator(endpointRuleSet.parameters).paramsStruct(),
197+
"Params" to EndpointParamsGenerator(codegenContext, endpointRuleSet.parameters).paramsStruct(),
194198
"additional_args" to fnsUsed.mapNotNull { it.additionalArgsInvocation("self") }.join(","),
195199
"resolver_fn" to resolverFn(endpointRuleSet, fnsUsed),
196200
*codegenScope,
@@ -202,7 +206,7 @@ internal class EndpointResolverGenerator(stdlib: List<CustomRuntimeFunction>, ru
202206
endpointRuleSet: EndpointRuleSet,
203207
fnsUsed: List<CustomRuntimeFunction>,
204208
): RuntimeType {
205-
return RuntimeType.forInlineFun("resolve_endpoint", EndpointImpl) {
209+
return RuntimeType.forInlineFun("resolve_endpoint", endpointImplModule(codegenContext)) {
206210
Attribute(allow(allowLintsForResolver)).render(this)
207211
rustTemplate(
208212
"""
@@ -212,7 +216,7 @@ internal class EndpointResolverGenerator(stdlib: List<CustomRuntimeFunction>, ru
212216
213217
""",
214218
*codegenScope,
215-
"Params" to EndpointParamsGenerator(endpointRuleSet.parameters).paramsStruct(),
219+
"Params" to EndpointParamsGenerator(codegenContext, endpointRuleSet.parameters).paramsStruct(),
216220
"additional_args" to fnsUsed.mapNotNull { it.additionalArgsSignature() }.join(","),
217221
"body" to resolverFnBody(endpointRuleSet),
218222
)

codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientRuntimeTypesReExportGenerator.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,16 @@ class ClientRuntimeTypesReExportGenerator(
3333
"Interceptor" to RuntimeType.interceptor(rc),
3434
)
3535
}
36+
rustCrate.withModule(ClientRustModule.endpoint(codegenContext)) {
37+
rustTemplate(
38+
"""
39+
pub use #{ResolveEndpoint};
40+
pub use #{SharedEndpointResolver};
41+
""",
42+
"ResolveEndpoint" to RuntimeType.smithyHttp(rc).resolve("endpoint::ResolveEndpoint"),
43+
"SharedEndpointResolver" to RuntimeType.smithyHttp(rc).resolve("endpoint::SharedEndpointResolver"),
44+
)
45+
}
3646
rustCrate.withModule(ClientRustModule.Config.retry) {
3747
rustTemplate(
3848
"""

codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointParamsGeneratorTest.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import org.junit.jupiter.params.ParameterizedTest
99
import org.junit.jupiter.params.provider.MethodSource
1010
import software.amazon.smithy.rulesengine.testutil.TestDiscovery
1111
import software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.EndpointParamsGenerator
12+
import software.amazon.smithy.rust.codegen.client.testutil.testClientCodegenContext
1213
import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate
1314
import software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace
1415
import software.amazon.smithy.rust.codegen.core.testutil.compileAndTest
@@ -25,14 +26,15 @@ internal class EndpointParamsGeneratorTest {
2526
@MethodSource("testSuites")
2627
fun `generate endpoint params for provided test suites`(testSuite: TestDiscovery.RulesTestSuite) {
2728
val project = TestWorkspace.testProject()
29+
val context = testClientCodegenContext()
2830
project.lib {
2931
unitTest("params_work") {
3032
rustTemplate(
3133
"""
3234
// this might fail if there are required fields
3335
let _ = #{Params}::builder().build();
3436
""",
35-
"Params" to EndpointParamsGenerator(testSuite.ruleSet().parameters).paramsStruct(),
37+
"Params" to EndpointParamsGenerator(context, testSuite.ruleSet().parameters).paramsStruct(),
3638
)
3739
}
3840
}

codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointResolverGeneratorTest.kt

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,15 +53,16 @@ class EndpointResolverGeneratorTest {
5353
// return
5454
}
5555
val project = TestWorkspace.testProject()
56+
val context = testClientCodegenContext()
5657
suite.ruleSet().typecheck()
5758
project.lib {
5859
val ruleset = EndpointResolverGenerator(
60+
context,
5961
SmithyEndpointsStdLib + awsStandardLib(TestRuntimeConfig, partitionsJson),
60-
TestRuntimeConfig,
6162
).defaultEndpointResolver(suite.ruleSet())
6263
val testGenerator = EndpointTestGenerator(
6364
suite.testSuite().testCases,
64-
paramsType = EndpointParamsGenerator(suite.ruleSet().parameters).paramsStruct(),
65+
paramsType = EndpointParamsGenerator(context, suite.ruleSet().parameters).paramsStruct(),
6566
resolverType = ruleset,
6667
suite.ruleSet().parameters,
6768
codegenContext = testClientCodegenContext(model = Model.builder().build()),
@@ -79,15 +80,16 @@ class EndpointResolverGeneratorTest {
7980
testSuites().filter { it.ruleSet().sourceLocation.filename.endsWith("/uri-encode.json") }.findFirst()
8081
.orElseThrow()
8182
val project = TestWorkspace.testProject()
83+
val context = testClientCodegenContext()
8284
suite.ruleSet().typecheck()
8385
project.lib {
8486
val ruleset = EndpointResolverGenerator(
87+
context,
8588
SmithyEndpointsStdLib + awsStandardLib(TestRuntimeConfig, partitionsJson),
86-
TestRuntimeConfig,
8789
).defaultEndpointResolver(suite.ruleSet())
8890
val testGenerator = EndpointTestGenerator(
8991
suite.testSuite().testCases,
90-
paramsType = EndpointParamsGenerator(suite.ruleSet().parameters).paramsStruct(),
92+
paramsType = EndpointParamsGenerator(context, suite.ruleSet().parameters).paramsStruct(),
9193
resolverType = ruleset,
9294
suite.ruleSet().parameters,
9395
codegenContext = testClientCodegenContext(Model.builder().build()),
@@ -115,7 +117,8 @@ class EndpointResolverGeneratorTest {
115117
val scope = Scope<Type>()
116118
scope.insert("Region", Type.string())
117119
endpoint.typeCheck(scope)
118-
val generator = EndpointResolverGenerator(listOf(), TestRuntimeConfig)
120+
val context = testClientCodegenContext()
121+
val generator = EndpointResolverGenerator(context, listOf())
119122
TestWorkspace.testProject().unitTest {
120123
rustTemplate(
121124
"""

0 commit comments

Comments
 (0)