Skip to content

Commit 14cf870

Browse files
authored
feat: add support for smithy.protocols#rpcv2Cbor protocol (#1103)
1 parent 823372c commit 14cf870

File tree

82 files changed

+6704
-134
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

82 files changed

+6704
-134
lines changed
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"id": "4f6cf597-a267-4bca-a8b9-98aa055a9a72",
3+
"type": "feature",
4+
"description": "Add support for `smithy.protocols#rpcv2Cbor` protocol",
5+
"issues": [
6+
"https://github.com/awslabs/aws-sdk-kotlin/issues/1302"
7+
]
8+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"id": "d079d678-08d3-437a-b638-2ef11e339938",
3+
"type": "feature",
4+
"description": "Add support for prioritized protocol resolution",
5+
"issues": [
6+
"https://github.com/smithy-lang/smithy-kotlin/issues/843"
7+
]
8+
}

codegen/protocol-tests/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ val enabledProtocols = listOf(
3030
ProtocolTest("aws-restxml", "aws.protocoltests.restxml#RestXml"),
3131
ProtocolTest("aws-restxml-xmlns", "aws.protocoltests.restxml.xmlns#RestXmlWithNamespace"),
3232
ProtocolTest("aws-query", "aws.protocoltests.query#AwsQuery"),
33+
ProtocolTest("smithy-rpcv2-cbor", "smithy.protocoltests.rpcv2Cbor#RpcV2Protocol"),
3334

3435
// Custom hand written tests
3536
ProtocolTest("error-correction-json", "aws.protocoltests.errorcorrection#RequiredValueJson"),
@@ -82,6 +83,7 @@ dependencies {
8283
// the aws-protocol-tests dependency is found when generating code such that the `includeServices` transform
8384
// actually works
8485
codegen(libs.smithy.aws.protocol.tests)
86+
codegen(libs.smithy.protocol.tests)
8587
}
8688

8789
tasks.generateSmithyProjections {

codegen/smithy-aws-kotlin-codegen/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ dependencies {
2828
api(libs.smithy.aws.iam.traits)
2929
api(libs.smithy.aws.cloudformation.traits)
3030
api(libs.smithy.protocol.test.traits)
31+
api(libs.smithy.protocol.traits)
3132
implementation(libs.smithy.aws.endpoints)
3233

3334
testImplementation(libs.junit.jupiter)

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,6 @@ class SdkProtocolGeneratorSupplier : KotlinIntegration {
2828
RestXml(),
2929
AwsQuery(),
3030
Ec2Query(),
31+
RpcV2Cbor(),
3132
)
3233
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
/*
2+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
package software.amazon.smithy.kotlin.codegen.aws.protocols
6+
7+
import software.amazon.smithy.kotlin.codegen.aws.protocols.core.AwsHttpBindingProtocolGenerator
8+
import software.amazon.smithy.kotlin.codegen.aws.protocols.core.StaticHttpBindingResolver
9+
import software.amazon.smithy.kotlin.codegen.core.KotlinWriter
10+
import software.amazon.smithy.kotlin.codegen.core.RuntimeTypes
11+
import software.amazon.smithy.kotlin.codegen.model.*
12+
import software.amazon.smithy.kotlin.codegen.model.traits.SyntheticClone
13+
import software.amazon.smithy.kotlin.codegen.rendering.protocol.*
14+
import software.amazon.smithy.kotlin.codegen.rendering.serde.CborParserGenerator
15+
import software.amazon.smithy.kotlin.codegen.rendering.serde.CborSerializerGenerator
16+
import software.amazon.smithy.kotlin.codegen.rendering.serde.StructuredDataParserGenerator
17+
import software.amazon.smithy.kotlin.codegen.rendering.serde.StructuredDataSerializerGenerator
18+
import software.amazon.smithy.model.Model
19+
import software.amazon.smithy.model.knowledge.HttpBinding
20+
import software.amazon.smithy.model.pattern.UriPattern
21+
import software.amazon.smithy.model.shapes.OperationShape
22+
import software.amazon.smithy.model.shapes.ServiceShape
23+
import software.amazon.smithy.model.shapes.ShapeId
24+
import software.amazon.smithy.model.traits.HttpTrait
25+
import software.amazon.smithy.model.traits.TimestampFormatTrait
26+
import software.amazon.smithy.model.traits.UnitTypeTrait
27+
import software.amazon.smithy.protocol.traits.Rpcv2CborTrait
28+
29+
class RpcV2Cbor : AwsHttpBindingProtocolGenerator() {
30+
override val protocol: ShapeId = Rpcv2CborTrait.ID
31+
32+
// TODO Timestamp format is not used in RpcV2Cbor since it's a binary protocol. We seem to be missing an abstraction
33+
// between text-based and binary-based protocols
34+
override val defaultTimestampFormat = TimestampFormatTrait.Format.UNKNOWN
35+
36+
override fun getProtocolHttpBindingResolver(model: Model, serviceShape: ServiceShape): HttpBindingResolver =
37+
RpcV2CborHttpBindingResolver(model, serviceShape)
38+
39+
override fun structuredDataSerializer(ctx: ProtocolGenerator.GenerationContext): StructuredDataSerializerGenerator =
40+
CborSerializerGenerator(this)
41+
42+
override fun structuredDataParser(ctx: ProtocolGenerator.GenerationContext): StructuredDataParserGenerator =
43+
CborParserGenerator(this)
44+
45+
override fun renderDeserializeErrorDetails(ctx: ProtocolGenerator.GenerationContext, op: OperationShape, writer: KotlinWriter) {
46+
writer.write("#T.deserialize(payload)", RuntimeTypes.SmithyRpcV2Protocols.Cbor.RpcV2CborErrorDeserializer)
47+
}
48+
49+
override fun getDefaultHttpMiddleware(ctx: ProtocolGenerator.GenerationContext): List<ProtocolMiddleware> {
50+
// Every request MUST contain a `smithy-protocol` header with the value of `rpc-v2-cbor`
51+
val smithyProtocolHeaderMiddleware = MutateHeadersMiddleware(overrideHeaders = mapOf("smithy-protocol" to "rpc-v2-cbor"))
52+
53+
// Every response MUST contain the same `smithy-protocol` header, otherwise it's considered invalid
54+
val validateSmithyProtocolHeaderMiddleware = object : ProtocolMiddleware {
55+
override val name: String = "RpcV2CborValidateSmithyProtocolResponseHeader"
56+
override fun render(ctx: ProtocolGenerator.GenerationContext, op: OperationShape, writer: KotlinWriter) {
57+
val interceptorSymbol = RuntimeTypes.SmithyRpcV2Protocols.Cbor.RpcV2CborSmithyProtocolResponseHeaderInterceptor
58+
writer.write("op.interceptors.add(#T)", interceptorSymbol)
59+
}
60+
}
61+
62+
// Requests with event stream responses MUST include an `Accept` header set to the value `application/vnd.amazon.eventstream`
63+
val eventStreamsAcceptHeaderMiddleware = object : ProtocolMiddleware {
64+
private val mutateHeadersMiddleware = MutateHeadersMiddleware(extraHeaders = mapOf("Accept" to "application/vnd.amazon.eventstream"))
65+
66+
override fun isEnabledFor(ctx: ProtocolGenerator.GenerationContext, op: OperationShape): Boolean = op.isOutputEventStream(ctx.model)
67+
override val name: String = "RpcV2CborEventStreamsAcceptHeaderMiddleware"
68+
override fun render(ctx: ProtocolGenerator.GenerationContext, op: OperationShape, writer: KotlinWriter) = mutateHeadersMiddleware.render(ctx, op, writer)
69+
}
70+
71+
// Emit a metric to track usage of RpcV2Cbor
72+
val businessMetricsMiddleware = object : ProtocolMiddleware {
73+
override val name: String = "RpcV2CborBusinessMetricsMiddleware"
74+
override fun render(ctx: ProtocolGenerator.GenerationContext, op: OperationShape, writer: KotlinWriter) {
75+
writer.write("op.context.#T(#T.PROTOCOL_RPC_V2_CBOR)", RuntimeTypes.Core.BusinessMetrics.emitBusinessMetric, RuntimeTypes.Core.BusinessMetrics.SmithyBusinessMetric)
76+
}
77+
}
78+
79+
return super.getDefaultHttpMiddleware(ctx) + listOf(
80+
smithyProtocolHeaderMiddleware,
81+
validateSmithyProtocolHeaderMiddleware,
82+
eventStreamsAcceptHeaderMiddleware,
83+
businessMetricsMiddleware,
84+
)
85+
}
86+
87+
/**
88+
* Exact copy of [HttpBindingProtocolGenerator.renderSerializeHttpBody] but with a custom
89+
* [OperationShape.hasHttpBody] function to handle protocol-specific serialization rules.
90+
*/
91+
override fun renderSerializeHttpBody(
92+
ctx: ProtocolGenerator.GenerationContext,
93+
op: OperationShape,
94+
writer: KotlinWriter,
95+
) {
96+
val resolver = getProtocolHttpBindingResolver(ctx.model, ctx.service)
97+
if (!op.hasHttpBody(ctx)) return
98+
99+
// payload member(s)
100+
val requestBindings = resolver.requestBindings(op)
101+
val httpPayload = requestBindings.firstOrNull { it.location == HttpBinding.Location.PAYLOAD }
102+
if (httpPayload != null) {
103+
renderExplicitHttpPayloadSerializer(ctx, httpPayload, writer)
104+
} else {
105+
val documentMembers = requestBindings.filterDocumentBoundMembers()
106+
// Unbound document members that should be serialized into the document format for the protocol.
107+
// delegate to the generate operation body serializer function
108+
val sdg = structuredDataSerializer(ctx)
109+
val opBodySerializerFn = sdg.operationSerializer(ctx, op, documentMembers)
110+
writer.write("builder.body = #T(context, input)", opBodySerializerFn)
111+
}
112+
renderContentTypeHeader(ctx, op, writer, resolver)
113+
}
114+
115+
/**
116+
* @return whether the operation input does _not_ target the unit shape ([UnitTypeTrait.UNIT])
117+
*/
118+
private fun OperationShape.hasHttpBody(ctx: ProtocolGenerator.GenerationContext): Boolean {
119+
val input = ctx.model.expectShape(inputShape).targetOrSelf(ctx.model).let {
120+
// If the input has been synthetically cloned from the original (most likely),
121+
// pull the archetype and check _that_
122+
it.getTrait<SyntheticClone>()?.let { clone ->
123+
ctx.model.expectShape(clone.archetype).targetOrSelf(ctx.model)
124+
} ?: it
125+
}
126+
127+
return input.id != UnitTypeTrait.UNIT
128+
}
129+
130+
override fun renderContentTypeHeader(
131+
ctx: ProtocolGenerator.GenerationContext,
132+
op: OperationShape,
133+
writer: KotlinWriter,
134+
resolver: HttpBindingResolver,
135+
) {
136+
writer.write("builder.headers.setMissing(\"Content-Type\", #S)", resolver.determineRequestContentType(op))
137+
}
138+
139+
class RpcV2CborHttpBindingResolver(
140+
model: Model,
141+
val serviceShape: ServiceShape,
142+
) : StaticHttpBindingResolver(
143+
model,
144+
serviceShape,
145+
HttpTrait.builder().code(200).method("POST").uri(UriPattern.parse("/")).build(),
146+
"application/cbor",
147+
TimestampFormatTrait.Format.UNKNOWN,
148+
) {
149+
150+
override fun httpTrait(operationShape: OperationShape): HttpTrait = HttpTrait
151+
.builder()
152+
.code(200)
153+
.method("POST")
154+
.uri(UriPattern.parse("/service/${serviceShape.id.name}/operation/${operationShape.id.name}"))
155+
.build()
156+
157+
override fun determineRequestContentType(operationShape: OperationShape): String = when {
158+
operationShape.isInputEventStream(model) -> "application/vnd.amazon.eventstream"
159+
else -> "application/cbor"
160+
}
161+
}
162+
}

codegen/smithy-kotlin-codegen-testutils/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ version = codegenVersion
2323
dependencies {
2424
implementation(kotlin("stdlib-jdk8"))
2525
implementation(libs.smithy.aws.traits)
26+
implementation(libs.smithy.protocol.traits)
2627
api(project(":codegen:smithy-kotlin-codegen"))
2728

2829
// Test dependencies

codegen/smithy-kotlin-codegen-testutils/src/main/kotlin/software/amazon/smithy/kotlin/codegen/test/CodegenTestUtils.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import software.amazon.smithy.model.knowledge.HttpBindingIndex
2626
import software.amazon.smithy.model.shapes.*
2727
import software.amazon.smithy.model.traits.TimestampFormatTrait
2828
import software.amazon.smithy.model.traits.Trait
29+
import software.amazon.smithy.protocol.traits.Rpcv2CborTrait
2930
import software.amazon.smithy.utils.StringUtils
3031

3132
// This file houses test classes and functions relating to the code generator (protocols, serializers, etc)
@@ -150,6 +151,7 @@ private val allProtocols = setOf(
150151
Ec2QueryTrait.ID,
151152
RestJson1Trait.ID,
152153
RestXmlTrait.ID,
154+
Rpcv2CborTrait.ID,
153155
)
154156

155157
/** An HttpBindingProtocolGenerator for testing (nothing is rendered for serializing/deserializing payload bodies) */

codegen/smithy-kotlin-codegen/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ dependencies {
2929
api(libs.smithy.waiters)
3030
implementation(libs.smithy.rules.engine)
3131
implementation(libs.smithy.aws.traits)
32+
implementation(libs.smithy.protocol.traits)
3233
implementation(libs.smithy.protocol.test.traits)
3334
implementation(libs.jsoup)
3435

codegen/smithy-kotlin-codegen/src/main/kotlin/software/amazon/smithy/kotlin/codegen/KotlinSettings.kt

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@
55

66
package software.amazon.smithy.kotlin.codegen
77

8+
import software.amazon.smithy.aws.traits.protocols.AwsJson1_0Trait
9+
import software.amazon.smithy.aws.traits.protocols.AwsJson1_1Trait
10+
import software.amazon.smithy.aws.traits.protocols.AwsQueryTrait
11+
import software.amazon.smithy.aws.traits.protocols.Ec2QueryTrait
12+
import software.amazon.smithy.aws.traits.protocols.RestJson1Trait
13+
import software.amazon.smithy.aws.traits.protocols.RestXmlTrait
814
import software.amazon.smithy.codegen.core.CodegenException
915
import software.amazon.smithy.kotlin.codegen.lang.isValidPackageName
1016
import software.amazon.smithy.kotlin.codegen.utils.getOrNull
@@ -17,6 +23,7 @@ import software.amazon.smithy.model.node.StringNode
1723
import software.amazon.smithy.model.shapes.ServiceShape
1824
import software.amazon.smithy.model.shapes.Shape
1925
import software.amazon.smithy.model.shapes.ShapeId
26+
import software.amazon.smithy.protocol.traits.Rpcv2CborTrait
2027
import java.util.Optional
2128
import java.util.logging.Logger
2229
import kotlin.IllegalArgumentException
@@ -34,6 +41,17 @@ private const val API_SETTINGS = "api"
3441
// Optional specification of sdkId for models that provide them, otherwise Service's shape id name is used
3542
private const val SDK_ID = "sdkId"
3643

44+
// Prioritized list of protocols supported for code generation
45+
private val DEFAULT_PROTOCOL_RESOLUTION_PRIORITY = setOf<ShapeId>(
46+
Rpcv2CborTrait.ID,
47+
AwsJson1_0Trait.ID,
48+
AwsJson1_1Trait.ID,
49+
RestJson1Trait.ID,
50+
RestXmlTrait.ID,
51+
AwsQueryTrait.ID,
52+
Ec2QueryTrait.ID,
53+
)
54+
3755
/**
3856
* Settings used by [KotlinCodegenPlugin]
3957
*/
@@ -133,9 +151,10 @@ data class KotlinSettings(
133151
supportedProtocolTraits: Set<ShapeId>,
134152
): ShapeId {
135153
val resolvedProtocols: Set<ShapeId> = serviceIndex.getProtocols(service).keys
136-
val protocol = resolvedProtocols.firstOrNull(supportedProtocolTraits::contains)
154+
val protocol = api.protocolResolutionPriority.firstOrNull { it in resolvedProtocols && supportedProtocolTraits.contains(it) }
137155
return protocol ?: throw UnresolvableProtocolException(
138156
"The ${service.id} service supports the following unsupported protocols $resolvedProtocols. " +
157+
"They were evaluated using the prioritized list: ${api.protocolResolutionPriority.joinToString()}. " +
139158
"The following protocol generators were found on the class path: $supportedProtocolTraits",
140159
)
141160
}
@@ -195,7 +214,6 @@ data class BuildSettings(
195214
}.orNull()
196215
}
197216
}.orNull()
198-
199217
BuildSettings(generateFullProject, generateBuildFiles, annotations, generateMultiplatformProject)
200218
}.orElse(Default)
201219

@@ -275,12 +293,14 @@ data class ApiSettings(
275293
val nullabilityCheckMode: CheckMode = CheckMode.CLIENT_CAREFUL,
276294
val defaultValueSerializationMode: DefaultValueSerializationMode = DefaultValueSerializationMode.WHEN_DIFFERENT,
277295
val enableEndpointAuthProvider: Boolean = false,
296+
val protocolResolutionPriority: Set<ShapeId> = DEFAULT_PROTOCOL_RESOLUTION_PRIORITY,
278297
) {
279298
companion object {
280299
const val VISIBILITY = "visibility"
281300
const val NULLABILITY_CHECK_MODE = "nullabilityCheckMode"
282301
const val DEFAULT_VALUE_SERIALIZATION_MODE = "defaultValueSerializationMode"
283302
const val ENABLE_ENDPOINT_AUTH_PROVIDER = "enableEndpointAuthProvider"
303+
const val PROTOCOL_RESOLUTION_PRIORITY = "protocolResolutionPriority"
284304

285305
fun fromNode(node: Optional<ObjectNode>): ApiSettings = node.map {
286306
val visibility = node.get()
@@ -299,7 +319,14 @@ data class ApiSettings(
299319
),
300320
)
301321
val enableEndpointAuthProvider = node.get().getBooleanMemberOrDefault(ENABLE_ENDPOINT_AUTH_PROVIDER, false)
302-
ApiSettings(visibility, checkMode, defaultValueSerializationMode, enableEndpointAuthProvider)
322+
323+
val protocolResolutionPriority = node.get()
324+
.getArrayMember(PROTOCOL_RESOLUTION_PRIORITY).getOrNull()
325+
?.map { ShapeId.from(it.asStringNode().get().value) }?.toSet() ?: run {
326+
DEFAULT_PROTOCOL_RESOLUTION_PRIORITY
327+
}
328+
329+
ApiSettings(visibility, checkMode, defaultValueSerializationMode, enableEndpointAuthProvider, protocolResolutionPriority)
303330
}.orElse(Default)
304331

305332
/**

codegen/smithy-kotlin-codegen/src/main/kotlin/software/amazon/smithy/kotlin/codegen/core/KotlinDependency.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ data class KotlinDependency(
108108
val SERDE_JSON = KotlinDependency(GradleConfiguration.Implementation, "$RUNTIME_ROOT_NS.serde.json", RUNTIME_GROUP, "serde-json", RUNTIME_VERSION)
109109
val SERDE_XML = KotlinDependency(GradleConfiguration.Implementation, "$RUNTIME_ROOT_NS.serde.xml", RUNTIME_GROUP, "serde-xml", RUNTIME_VERSION)
110110
val SERDE_FORM_URL = KotlinDependency(GradleConfiguration.Implementation, "$RUNTIME_ROOT_NS.serde.formurl", RUNTIME_GROUP, "serde-form-url", RUNTIME_VERSION)
111+
val SERDE_CBOR = KotlinDependency(GradleConfiguration.Implementation, "$RUNTIME_ROOT_NS.serde.cbor", RUNTIME_GROUP, "serde-cbor", RUNTIME_VERSION)
111112
val SMITHY_CLIENT = KotlinDependency(GradleConfiguration.Api, "$RUNTIME_ROOT_NS.client", RUNTIME_GROUP, "smithy-client", RUNTIME_VERSION)
112113
val SMITHY_TEST = KotlinDependency(GradleConfiguration.TestImplementation, "$RUNTIME_ROOT_NS.smithy.test", RUNTIME_GROUP, "smithy-test", RUNTIME_VERSION)
113114
val DEFAULT_HTTP_ENGINE = KotlinDependency(GradleConfiguration.Implementation, "$RUNTIME_ROOT_NS.http.engine", RUNTIME_GROUP, "http-client-engine-default", RUNTIME_VERSION)
@@ -125,6 +126,8 @@ data class KotlinDependency(
125126
val HTTP_AUTH = KotlinDependency(GradleConfiguration.Implementation, "$RUNTIME_ROOT_NS.http.auth", RUNTIME_GROUP, "http-auth", RUNTIME_VERSION)
126127
val HTTP_AUTH_AWS = KotlinDependency(GradleConfiguration.Implementation, "$RUNTIME_ROOT_NS.http.auth", RUNTIME_GROUP, "http-auth-aws", RUNTIME_VERSION)
127128
val IDENTITY_API = KotlinDependency(GradleConfiguration.Implementation, "$RUNTIME_ROOT_NS", RUNTIME_GROUP, "identity-api", RUNTIME_VERSION)
129+
val SMITHY_RPCV2_PROTOCOLS = KotlinDependency(GradleConfiguration.Implementation, "$RUNTIME_ROOT_NS.awsprotocol.rpcv2", RUNTIME_GROUP, "smithy-rpcv2-protocols", RUNTIME_VERSION)
130+
val SMITHY_RPCV2_PROTOCOLS_CBOR = KotlinDependency(GradleConfiguration.Implementation, "$RUNTIME_ROOT_NS.awsprotocol.rpcv2.cbor", RUNTIME_GROUP, "smithy-rpcv2-protocols", RUNTIME_VERSION)
128131

129132
// External third-party dependencies
130133
val KOTLIN_STDLIB = KotlinDependency(GradleConfiguration.Implementation, "kotlin", "org.jetbrains.kotlin", "kotlin-stdlib", KOTLIN_COMPILER_VERSION)

codegen/smithy-kotlin-codegen/src/main/kotlin/software/amazon/smithy/kotlin/codegen/core/RuntimeTypes.kt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,12 @@ object RuntimeTypes {
302302
val QueryLiteral = symbol("QueryLiteral")
303303
val FormUrlSerializer = symbol("FormUrlSerializer")
304304
}
305+
306+
object SerdeCbor : RuntimeTypePackage(KotlinDependency.SERDE_CBOR) {
307+
val CborSerializer = symbol("CborSerializer")
308+
val CborDeserializer = symbol("CborDeserializer")
309+
val CborSerialName = symbol("CborSerialName")
310+
}
305311
}
306312

307313
object Auth {
@@ -422,6 +428,13 @@ object RuntimeTypes {
422428
val parseEc2QueryErrorResponseNoSuspend = symbol("parseEc2QueryErrorResponseNoSuspend")
423429
}
424430

431+
object SmithyRpcV2Protocols : RuntimeTypePackage(KotlinDependency.SMITHY_RPCV2_PROTOCOLS) {
432+
object Cbor : RuntimeTypePackage(KotlinDependency.SMITHY_RPCV2_PROTOCOLS_CBOR) {
433+
val RpcV2CborErrorDeserializer = symbol("RpcV2CborErrorDeserializer")
434+
val RpcV2CborSmithyProtocolResponseHeaderInterceptor = symbol("RpcV2CborSmithyProtocolResponseHeaderInterceptor")
435+
}
436+
}
437+
425438
object AwsEventStream : RuntimeTypePackage(KotlinDependency.AWS_EVENT_STREAM) {
426439
val HeaderValue = symbol("HeaderValue")
427440
val Message = symbol("Message")

0 commit comments

Comments
 (0)