Skip to content

Commit bf680c3

Browse files
authored
fix: Don't unwrap unneeded value during event marshal (#839)
1 parent bf096bf commit bf680c3

File tree

1 file changed

+16
-4
lines changed

1 file changed

+16
-4
lines changed

smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/events/MessageMarshallableGenerator.kt

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ class MessageMarshallableGenerator(
2727
) {
2828
internal fun render(streamShape: UnionShape) {
2929
val streamSymbol: Symbol = ctx.symbolProvider.toSymbol(streamShape)
30-
val rootNamespace = ctx.settings.moduleName
3130
val filename = ModelFileUtils.filename(ctx.settings, "${streamSymbol.name}+MessageMarshallable")
3231
val streamMember = Symbol.builder()
3332
.definitionFile(filename)
@@ -50,10 +49,12 @@ class MessageMarshallableGenerator(
5049
write("switch self {")
5150
streamShape.eventStreamEvents(ctx.model).forEach { member ->
5251
val memberName = ctx.symbolProvider.toMemberName(member)
53-
write("case .\$L(let value):", memberName)
54-
indent()
55-
addStringHeader(":event-type", member.memberName)
5652
val variant = ctx.model.expectShape(member.target)
53+
54+
// Write the enum case for this event type.
55+
// Unbound, header-bound, and payload-bound members require access to
56+
// the event value for serialization, so unwrap value when
57+
// those members exist. The actual members will be written below.
5758
val eventHeaderBindings = variant.members().filter {
5859
it.hasTrait<EventHeaderTrait>()
5960
}
@@ -63,11 +64,22 @@ class MessageMarshallableGenerator(
6364
val unbound = variant.members().filterNot {
6465
it.hasTrait<EventHeaderTrait>() || it.hasTrait<EventPayloadTrait>()
6566
}
67+
if (unbound.isNotEmpty() || eventHeaderBindings.isNotEmpty() || eventPayloadBinding != null) {
68+
write("case .\$L(let value):", memberName)
69+
} else {
70+
write("case .\$L:", memberName)
71+
}
72+
indent()
6673

74+
// Write the event headers to the message. First write the
75+
// event type, followed by header-bound members.
76+
addStringHeader(":event-type", member.memberName)
6777
eventHeaderBindings.forEach {
6878
renderSerializeEventHeader(ctx, it, writer)
6979
}
7080

81+
// Write either the payload or the unbound members (there won't be both,
82+
// according to the Smithy spec: https://smithy.io/2.0/spec/streaming.html#eventpayload-trait.)
7183
when {
7284
eventPayloadBinding != null -> renderSerializeEventPayload(ctx, eventPayloadBinding, writer)
7385
unbound.isNotEmpty() -> {

0 commit comments

Comments
 (0)