Skip to content

Commit a8aea3c

Browse files
authored
fix: Correct serde for restJson1 event streams that contain errors (#596)
1 parent 88529fe commit a8aea3c

File tree

7 files changed

+22
-18
lines changed

7 files changed

+22
-18
lines changed

smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/integration/HttpBindingProtocolGenerator.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,8 @@ abstract class HttpBindingProtocolGenerator : ProtocolGenerator {
173173
generateCodingKeysForMembers(ctx, writer, httpBodyMembers)
174174
writer.write("")
175175
}
176-
renderStructEncode(ctx, shape, shapeMetadata, httpBodyMembers, writer, defaultTimestampFormat, "")
176+
val path = "properties.".takeIf { shape.hasTrait<ErrorTrait>() } ?: null
177+
renderStructEncode(ctx, shape, shapeMetadata, httpBodyMembers, writer, defaultTimestampFormat, path)
177178
}
178179
}
179180
}
@@ -462,7 +463,7 @@ abstract class HttpBindingProtocolGenerator : ProtocolGenerator {
462463
members: List<MemberShape>,
463464
writer: SwiftWriter,
464465
defaultTimestampFormat: TimestampFormatTrait.Format,
465-
path: String
466+
path: String? = null
466467
)
467468
protected abstract fun renderStructDecode(
468469
ctx: ProtocolGenerator.GenerationContext,

smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/integration/serde/json/MemberShapeEncodeGenerator.kt

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,8 @@ abstract class MemberShapeEncodeGenerator(
107107
memberName: String,
108108
containerName: String,
109109
codingKey: String?,
110-
isBoxed: Boolean
110+
isBoxed: Boolean,
111+
path: String? = null
111112
) {
112113
val targetShape = when (memberShape) {
113114
is MemberShape -> ctx.model.expectShape(memberShape.target)
@@ -236,15 +237,16 @@ abstract class MemberShapeEncodeGenerator(
236237
fun renderSimpleEncodeMember(
237238
target: Shape,
238239
member: MemberShape,
239-
containerName: String
240+
containerName: String,
241+
path: String? = null
240242
) {
241243
val symbol = ctx.symbolProvider.toSymbol(member)
242244
val memberName = ctx.symbolProvider.toMemberName(member)
243245
val isBoxed = symbol.isBoxed()
244246
val memberWithExtension = getShapeExtension(member, memberName, isBoxed, true)
245247
if (isBoxed) {
246-
writer.openBlock("if let $memberName = self.$memberName {", "}") {
247-
renderSimpleShape(member, memberName, containerName, ".$memberName", isBoxed)
248+
writer.openBlock("if let $memberName = self.${path ?: ""}$memberName {", "}") {
249+
renderSimpleShape(member, memberName, containerName, ".$memberName", isBoxed, path)
248250
}
249251
} else {
250252
val primitiveSymbols: MutableSet<ShapeType> = hashSetOf(
@@ -254,10 +256,10 @@ abstract class MemberShapeEncodeGenerator(
254256
if (primitiveSymbols.contains(target.type)) {
255257
val defaultValue = getDefaultValueOfShapeType(target.type)
256258
writer.openBlock("if $memberName != $defaultValue {", "}") {
257-
renderSimpleShape(member, memberName, containerName, ".$memberName", isBoxed)
259+
renderSimpleShape(member, memberName, containerName, ".$memberName", isBoxed, path)
258260
}
259261
} else
260-
renderSimpleShape(member, memberName, containerName, ".$memberName", isBoxed)
262+
renderSimpleShape(member, memberName, containerName, ".$memberName", isBoxed, path)
261263
}
262264
}
263265

smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/integration/serde/json/StructEncodeGenerator.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@ class StructEncodeGenerator(
4545
private val ctx: ProtocolGenerator.GenerationContext,
4646
private val members: List<MemberShape>,
4747
private val writer: SwiftWriter,
48-
private val defaultTimestampFormat: TimestampFormatTrait.Format
48+
private val defaultTimestampFormat: TimestampFormatTrait.Format,
49+
private val path: String? = null
4950
) : MemberShapeEncodeGenerator(ctx, writer, defaultTimestampFormat) {
5051
override fun render() {
5152
val containerName = "encodeContainer"
@@ -58,18 +59,18 @@ class StructEncodeGenerator(
5859
val memberName = ctx.symbolProvider.toMemberName(member)
5960
when (target) {
6061
is CollectionShape -> {
61-
writer.openBlock("if let $memberName = $memberName {", "}") {
62+
writer.openBlock("if let $memberName = ${path ?: ""}$memberName {", "}") {
6263
renderEncodeListMember(target, memberName, containerName)
6364
}
6465
}
6566
is MapShape -> {
66-
writer.openBlock("if let $memberName = $memberName {", "}") {
67+
writer.openBlock("if let $memberName = ${path ?: ""}$memberName {", "}") {
6768
renderEncodeMapMember(target, memberName, containerName)
6869
}
6970
}
7071
else -> {
7172
renderSimpleEncodeMember(
72-
target, member, containerName
73+
target, member, containerName, path
7374
)
7475
}
7576
}

smithy-swift-codegen/src/test/kotlin/mocks/MockHttpAWSJson11ProtocolGenerator.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,9 @@ class MockHttpAWSJson11ProtocolGenerator : HttpBindingProtocolGenerator() {
9696
members: List<MemberShape>,
9797
writer: SwiftWriter,
9898
defaultTimestampFormat: TimestampFormatTrait.Format,
99-
path: String
99+
path: String?
100100
) {
101-
val encodeGenerator = StructEncodeGenerator(ctx, members, writer, defaultTimestampFormat)
101+
val encodeGenerator = StructEncodeGenerator(ctx, members, writer, defaultTimestampFormat, path)
102102
encodeGenerator.render()
103103
}
104104
override fun renderStructDecode(

smithy-swift-codegen/src/test/kotlin/mocks/MockHttpEC2QueryProtocolGenerator.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ class MockHttpEC2QueryProtocolGenerator : HttpBindingProtocolGenerator() {
8888
members: List<MemberShape>,
8989
writer: SwiftWriter,
9090
defaultTimestampFormat: TimestampFormatTrait.Format,
91-
path: String
91+
path: String?
9292
) {
9393
val customizations = MockEc2QueryFormURLEncodeCustomizations()
9494
val encodeGenerator = StructEncodeFormURLGenerator(ctx, customizations, shapeContainingMembers, shapeMetadata, members, writer, defaultTimestampFormat)

smithy-swift-codegen/src/test/kotlin/mocks/MockHttpRestJsonProtocolGenerator.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,9 @@ class MockHttpRestJsonProtocolGenerator : HttpBindingProtocolGenerator() {
7777
members: List<MemberShape>,
7878
writer: SwiftWriter,
7979
defaultTimestampFormat: TimestampFormatTrait.Format,
80-
path: String
80+
path: String?
8181
) {
82-
val encodeGenerator = StructEncodeGenerator(ctx, members, writer, defaultTimestampFormat)
82+
val encodeGenerator = StructEncodeGenerator(ctx, members, writer, defaultTimestampFormat, path)
8383
encodeGenerator.render()
8484
}
8585
override fun renderStructDecode(

smithy-swift-codegen/src/test/kotlin/mocks/MockHttpRestXMLProtocolGenerator.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ class MockHttpRestXMLProtocolGenerator : HttpBindingProtocolGenerator() {
5454
members: List<MemberShape>,
5555
writer: SwiftWriter,
5656
defaultTimestampFormat: TimestampFormatTrait.Format,
57-
path: String
57+
path: String?
5858
) {
5959
val encoder = StructEncodeXMLGenerator(ctx, shapeContainingMembers, members, writer, defaultTimestampFormat)
6060
encoder.render()

0 commit comments

Comments
 (0)