Skip to content

Commit d0269d2

Browse files
authored
fix: Correct serde for errors in event streams (#585)
1 parent 0622b20 commit d0269d2

File tree

8 files changed

+27
-13
lines changed

8 files changed

+27
-13
lines changed

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

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import software.amazon.smithy.model.shapes.StructureShape
2222
import software.amazon.smithy.model.shapes.TimestampShape
2323
import software.amazon.smithy.model.shapes.UnionShape
2424
import software.amazon.smithy.model.traits.EnumTrait
25+
import software.amazon.smithy.model.traits.ErrorTrait
2526
import software.amazon.smithy.model.traits.HttpHeaderTrait
2627
import software.amazon.smithy.model.traits.HttpLabelTrait
2728
import software.amazon.smithy.model.traits.HttpPayloadTrait
@@ -172,7 +173,7 @@ abstract class HttpBindingProtocolGenerator : ProtocolGenerator {
172173
generateCodingKeysForMembers(ctx, writer, httpBodyMembers)
173174
writer.write("")
174175
}
175-
renderStructEncode(ctx, shape, shapeMetadata, httpBodyMembers, writer, defaultTimestampFormat)
176+
renderStructEncode(ctx, shape, shapeMetadata, httpBodyMembers, writer, defaultTimestampFormat, "")
176177
}
177178
}
178179
}
@@ -232,9 +233,10 @@ abstract class HttpBindingProtocolGenerator : ProtocolGenerator {
232233
val httpBodyMembers = members.filter { it.isInHttpBody() }
233234
generateCodingKeysForMembers(ctx, writer, httpBodyMembers)
234235
writer.write("")
235-
renderStructEncode(ctx, shape, mapOf(), httpBodyMembers, writer, defaultTimestampFormat)
236+
val path = "properties.".takeIf { shape.hasTrait<ErrorTrait>() } ?: ""
237+
renderStructEncode(ctx, shape, mapOf(), httpBodyMembers, writer, defaultTimestampFormat, path)
236238
writer.write("")
237-
renderStructDecode(ctx, mapOf(), httpBodyMembers, writer, defaultTimestampFormat)
239+
renderStructDecode(ctx, mapOf(), httpBodyMembers, writer, defaultTimestampFormat, path)
238240
}
239241
is UnionShape -> {
240242
// get all members of the union shape
@@ -275,7 +277,7 @@ abstract class HttpBindingProtocolGenerator : ProtocolGenerator {
275277
writer.addImport(SwiftDependency.CLIENT_RUNTIME.target)
276278
generateCodingKeysForMembers(ctx, writer, httpBodyMembers)
277279
writer.write("")
278-
renderStructDecode(ctx, metadata, httpBodyMembers, writer, defaultTimestampFormat)
280+
renderStructDecode(ctx, metadata, httpBodyMembers, writer, defaultTimestampFormat, "")
279281
}
280282
}
281283
}
@@ -440,14 +442,16 @@ abstract class HttpBindingProtocolGenerator : ProtocolGenerator {
440442
shapeMetaData: Map<ShapeMetadata, Any>,
441443
members: List<MemberShape>,
442444
writer: SwiftWriter,
443-
defaultTimestampFormat: TimestampFormatTrait.Format
445+
defaultTimestampFormat: TimestampFormatTrait.Format,
446+
path: String
444447
)
445448
protected abstract fun renderStructDecode(
446449
ctx: ProtocolGenerator.GenerationContext,
447450
shapeMetaData: Map<ShapeMetadata, Any>,
448451
members: List<MemberShape>,
449452
writer: SwiftWriter,
450-
defaultTimestampFormat: TimestampFormatTrait.Format
453+
defaultTimestampFormat: TimestampFormatTrait.Format,
454+
path: String
451455
)
452456
protected abstract fun addProtocolSpecificMiddleware(ctx: ProtocolGenerator.GenerationContext, operation: OperationShape)
453457

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ Includes functions to help render conformance to Decodable protocol for shapes
3434
abstract class MemberShapeDecodeGenerator(
3535
private val ctx: ProtocolGenerator.GenerationContext,
3636
private val writer: SwiftWriter,
37-
private val defaultTimestampFormat: TimestampFormatTrait.Format
37+
private val defaultTimestampFormat: TimestampFormatTrait.Format,
38+
private val path: String
3839
) : MemberShapeDecodeGeneratable {
3940
fun renderDecodeForTimestamp(ctx: ProtocolGenerator.GenerationContext, target: Shape, member: MemberShape, containerName: String) {
4041
val memberName = ctx.symbolProvider.toMemberName(member)
@@ -154,7 +155,7 @@ abstract class MemberShapeDecodeGenerator(
154155
*/
155156
open fun renderAssigningDecodedMember(topLevelMember: MemberShape, decodedMemberName: String) {
156157
val topLevelMemberName = ctx.symbolProvider.toMemberName(topLevelMember)
157-
writer.write("\$L = \$L", topLevelMemberName, decodedMemberName)
158+
writer.write("\$L\$L = \$L", path, topLevelMemberName, decodedMemberName)
158159
}
159160

160161
private fun renderDecodeListTarget(shape: Shape, decodedMemberName: String, collectionName: String, insertMethod: String, topLevelMember: MemberShape, parentMember: Shape, level: Int = 0) {

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,9 @@ class StructDecodeGenerator(
4646
private val ctx: ProtocolGenerator.GenerationContext,
4747
private val members: List<MemberShape>,
4848
private val writer: SwiftWriter,
49-
private val defaultTimestampFormat: TimestampFormatTrait.Format
50-
) : MemberShapeDecodeGenerator(ctx, writer, defaultTimestampFormat) {
49+
private val defaultTimestampFormat: TimestampFormatTrait.Format,
50+
private val path: String
51+
) : MemberShapeDecodeGenerator(ctx, writer, defaultTimestampFormat, path) {
5152
override fun render() {
5253
val containerName = "containerValues"
5354
writer.openBlock("public init(from decoder: \$N) throws {", "}", SwiftTypes.Decoder) {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ class UnionDecodeGenerator(
1818
private val members: List<MemberShape>,
1919
private val writer: SwiftWriter,
2020
private val defaultTimestampFormat: TimestampFormatTrait.Format
21-
) : MemberShapeDecodeGenerator(ctx, writer, defaultTimestampFormat) {
21+
) : MemberShapeDecodeGenerator(ctx, writer, defaultTimestampFormat, "") {
2222
override fun render() {
2323
val containerName = "values"
2424
writer.openBlock("public init(from decoder: \$N) throws {", "}", SwiftTypes.Decoder) {

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ class MockHttpAWSJson11ProtocolGenerator : HttpBindingProtocolGenerator() {
9696
members: List<MemberShape>,
9797
writer: SwiftWriter,
9898
defaultTimestampFormat: TimestampFormatTrait.Format,
99+
path: String
99100
) {
100101
val encodeGenerator = StructEncodeGenerator(ctx, members, writer, defaultTimestampFormat)
101102
encodeGenerator.render()
@@ -106,8 +107,9 @@ class MockHttpAWSJson11ProtocolGenerator : HttpBindingProtocolGenerator() {
106107
members: List<MemberShape>,
107108
writer: SwiftWriter,
108109
defaultTimestampFormat: TimestampFormatTrait.Format,
110+
path: String
109111
) {
110-
val decodeGenerator = StructDecodeGenerator(ctx, members, writer, defaultTimestampFormat)
112+
val decodeGenerator = StructDecodeGenerator(ctx, members, writer, defaultTimestampFormat, path)
111113
decodeGenerator.render()
112114
}
113115

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ class MockHttpEC2QueryProtocolGenerator : HttpBindingProtocolGenerator() {
8888
members: List<MemberShape>,
8989
writer: SwiftWriter,
9090
defaultTimestampFormat: TimestampFormatTrait.Format,
91+
path: String
9192
) {
9293
val customizations = MockEc2QueryFormURLEncodeCustomizations()
9394
val encodeGenerator = StructEncodeFormURLGenerator(ctx, customizations, shapeContainingMembers, shapeMetadata, members, writer, defaultTimestampFormat)
@@ -99,6 +100,7 @@ class MockHttpEC2QueryProtocolGenerator : HttpBindingProtocolGenerator() {
99100
members: List<MemberShape>,
100101
writer: SwiftWriter,
101102
defaultTimestampFormat: TimestampFormatTrait.Format,
103+
path: String
102104
) {
103105
val decodeGenerator = StructDecodeXMLGenerator(ctx, members, mapOf(), writer, defaultTimestampFormat)
104106
decodeGenerator.render()

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ class MockHttpRestJsonProtocolGenerator : HttpBindingProtocolGenerator() {
7777
members: List<MemberShape>,
7878
writer: SwiftWriter,
7979
defaultTimestampFormat: TimestampFormatTrait.Format,
80+
path: String
8081
) {
8182
val encodeGenerator = StructEncodeGenerator(ctx, members, writer, defaultTimestampFormat)
8283
encodeGenerator.render()
@@ -87,8 +88,9 @@ class MockHttpRestJsonProtocolGenerator : HttpBindingProtocolGenerator() {
8788
members: List<MemberShape>,
8889
writer: SwiftWriter,
8990
defaultTimestampFormat: TimestampFormatTrait.Format,
91+
path: String
9092
) {
91-
val decodeGenerator = StructDecodeGenerator(ctx, members, writer, defaultTimestampFormat)
93+
val decodeGenerator = StructDecodeGenerator(ctx, members, writer, defaultTimestampFormat, path)
9294
decodeGenerator.render()
9395
}
9496

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ class MockHttpRestXMLProtocolGenerator : HttpBindingProtocolGenerator() {
5454
members: List<MemberShape>,
5555
writer: SwiftWriter,
5656
defaultTimestampFormat: TimestampFormatTrait.Format,
57+
path: String
5758
) {
5859
val encoder = StructEncodeXMLGenerator(ctx, shapeContainingMembers, members, writer, defaultTimestampFormat)
5960
encoder.render()
@@ -66,6 +67,7 @@ class MockHttpRestXMLProtocolGenerator : HttpBindingProtocolGenerator() {
6667
members: List<MemberShape>,
6768
writer: SwiftWriter,
6869
defaultTimestampFormat: TimestampFormatTrait.Format,
70+
path: String
6971
) {
7072
val decodeGenerator = StructDecodeXMLGenerator(ctx, members, shapeMetadata, writer, defaultTimestampFormat)
7173
decodeGenerator.render()

0 commit comments

Comments
 (0)