Skip to content

Commit 0bed43b

Browse files
authored
feat: add codegen wrappers for retries (#331)
1 parent 4d89b3b commit 0bed43b

File tree

4 files changed

+46
-2
lines changed

4 files changed

+46
-2
lines changed
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/*
2+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
* SPDX-License-Identifier: Apache-2.0.
4+
*/
5+
6+
package aws.sdk.kotlin.codegen
7+
8+
import software.amazon.smithy.kotlin.codegen.core.KotlinWriter
9+
import software.amazon.smithy.kotlin.codegen.core.RuntimeTypes
10+
import software.amazon.smithy.kotlin.codegen.integration.KotlinIntegration
11+
import software.amazon.smithy.kotlin.codegen.rendering.protocol.HttpFeatureMiddleware
12+
import software.amazon.smithy.kotlin.codegen.rendering.protocol.ProtocolGenerator
13+
import software.amazon.smithy.kotlin.codegen.rendering.protocol.ProtocolMiddleware
14+
import software.amazon.smithy.kotlin.codegen.rendering.protocol.replace
15+
import software.amazon.smithy.kotlin.codegen.retries.StandardRetryMiddleware
16+
17+
/**
18+
* Adds AWS-specific retry wrappers around operation invocations. This replaces
19+
* [StandardRetryPolicy][aws.smithy.kotlin.runtime.retries.impl] with
20+
* [AwsDefaultRetryPolicy][aws.sdk.kotlin.runtime.http.retries].
21+
*/
22+
class AwsDefaultRetryIntegration : KotlinIntegration {
23+
override fun customizeMiddleware(
24+
ctx: ProtocolGenerator.GenerationContext,
25+
resolved: List<ProtocolMiddleware>
26+
): List<ProtocolMiddleware> = resolved.replace(middleware) { it.name == StandardRetryMiddleware.name }
27+
}
28+
29+
private val middleware = object : HttpFeatureMiddleware() {
30+
override val name: String = "RetryFeature"
31+
32+
override fun renderConfigure(writer: KotlinWriter) {
33+
writer.addImport(RuntimeTypes.Http.Middlware.RetryFeature)
34+
writer.addImport(AwsRuntimeTypes.Http.Retries.AwsDefaultRetryPolicy)
35+
36+
writer.write("strategy = config.retryStrategy")
37+
writer.write("policy = AwsDefaultRetryPolicy")
38+
}
39+
}

codegen/smithy-aws-kotlin-codegen/src/main/kotlin/aws/sdk/kotlin/codegen/AwsRuntimeTypes.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,10 @@ object AwsRuntimeTypes {
5757
object Http {
5858
val withPayload = runtimeSymbol("withPayload", AwsKotlinDependency.AWS_HTTP)
5959
val setAseErrorMetadata = runtimeSymbol("setAseErrorMetadata", AwsKotlinDependency.AWS_HTTP)
60+
61+
object Retries {
62+
val AwsDefaultRetryPolicy = runtimeSymbol("AwsDefaultRetryPolicy", AwsKotlinDependency.AWS_HTTP, "retries")
63+
}
6064
}
6165

6266
object JsonProtocols {

codegen/smithy-aws-kotlin-codegen/src/main/kotlin/aws/sdk/kotlin/codegen/protocols/middleware/MutateHeadersMiddleware.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class MutateHeadersMiddleware(
2020
override val name: String = "MutateHeaders"
2121
override val order: Byte = 10
2222
override fun renderConfigure(writer: KotlinWriter) {
23-
writer.addImport(RuntimeTypes.Http.MutateHeadersMiddleware)
23+
writer.addImport(RuntimeTypes.Http.Middlware.MutateHeadersMiddleware)
2424
overrideHeaders.forEach {
2525
writer.write("set(#S, #S)", it.key, it.value)
2626
}

codegen/smithy-aws-kotlin-codegen/src/main/resources/META-INF/services/software.amazon.smithy.kotlin.codegen.integration.KotlinIntegration

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
aws.sdk.kotlin.codegen.SdkProtocolGeneratorSupplier
2+
aws.sdk.kotlin.codegen.AwsDefaultRetryIntegration
23
aws.sdk.kotlin.codegen.customization.s3.S3GeneratorSupplier
34
aws.sdk.kotlin.codegen.GradleGenerator
45
aws.sdk.kotlin.codegen.AwsServiceConfigIntegration
@@ -12,4 +13,4 @@ aws.sdk.kotlin.codegen.customization.apigateway.ApiGatewayAddAcceptHeader
1213
aws.sdk.kotlin.codegen.customization.glacier.GlacierAddVersionHeader
1314
aws.sdk.kotlin.codegen.customization.glacier.GlacierAccountIdDefault
1415
aws.sdk.kotlin.codegen.customization.polly.PollyPresigner
15-
aws.sdk.kotlin.codegen.customization.BoxServices
16+
aws.sdk.kotlin.codegen.customization.BoxServices

0 commit comments

Comments
 (0)