Skip to content

Commit acc7ef8

Browse files
committed
expose serializeInputEventDocumentPayload() to generate protocol-specific event payload
1 parent 0cece23 commit acc7ef8

File tree

1 file changed

+40
-15
lines changed

1 file changed

+40
-15
lines changed

smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/integration/HttpBindingProtocolGenerator.java

Lines changed: 40 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1350,6 +1350,32 @@ protected abstract void serializeInputDocumentBody(
13501350
List<HttpBinding> documentBindings
13511351
);
13521352

1353+
/**
1354+
* Writes the code needed to serialize an event payload as a protocol-specific document.
1355+
*
1356+
* <p>Implementations of this method are expected to set a value to the ${@code message.body} property.
1357+
* The value set is expected to by a JavaScript ${@code Uint8Array} type and is to be encoded as the
1358+
* event payload.
1359+
*
1360+
* <p>Two parameters will be available in scope:
1361+
* <ul>
1362+
* <li>{@code message: <T>}: The partially constructed event message.</li>
1363+
* <li>{@code context: SerdeContext}: a TypeScript type containing context and tools for type serde.</li>
1364+
* </ul>
1365+
*
1366+
* <p>For example:
1367+
*
1368+
* <pre>{@code
1369+
* message.body = context.utf8Decoder(JSON.stringify(bodyParams));
1370+
* }</pre>
1371+
* @param context The generation context.
1372+
* @param payloadShape The payload shape. Only structure and union shape is serialized as document.
1373+
*/
1374+
protected abstract void serializeInputEventDocumentPayload(
1375+
GenerationContext context,
1376+
Shape payloadShape
1377+
);
1378+
13531379
/**
13541380
* Writes the code needed to serialize a protocol output document.
13551381
*
@@ -1611,25 +1637,24 @@ private void writeEventBody(GenerationContext context, StructureShape event) {
16111637
TypeScriptWriter writer = context.getWriter();
16121638
Model model = context.getModel();
16131639
List<MemberShape> payloadMembers = event.getAllMembers().values().stream()
1614-
.filter(member -> member.hasTrait(EventPayloadTrait.class)).collect(Collectors.toList());
1615-
List<MemberShape> documentMembers = event.getAllMembers().values().stream()
1616-
.filter(member -> !member.hasTrait(EventHeaderTrait.class)
1617-
&& !member.hasTrait(EventPayloadTrait.class))
1640+
.filter(member -> member.hasTrait(EventPayloadTrait.class))
16181641
.collect(Collectors.toList());
1619-
if (!payloadMembers.isEmpty()) {
1620-
// Write event payload if exists. There is at most 1 payload member.
1642+
Shape payloadShape = payloadMembers.isEmpty()
1643+
? event
1644+
: model.expectShape(payloadMembers.get(0).getTarget());
1645+
if (payloadShape instanceof BlobShape || payloadShape instanceof StringShape) {
1646+
// Since event itself must be a structure shape, so string or blob payload member must has eventPayload
1647+
// trait explicitly.
16211648
MemberShape payloadMember = payloadMembers.get(0);
1622-
String memberName = payloadMember.getMemberName();
1649+
String payloadMemberName = payloadMember.getMemberName();
16231650
writer.write("message.body = $L || message.body;",
1624-
getInputValue(context, Location.PAYLOAD, "input." + memberName, payloadMember,
1651+
getInputValue(context, Location.PAYLOAD, "input." + payloadMemberName, payloadMember,
16251652
model.expectShape(payloadMember.getTarget())));
1626-
} else if (!documentMembers.isEmpty()) {
1627-
// Write event document bindings if exist.
1628-
SymbolProvider symbolProvider = context.getSymbolProvider();
1629-
Symbol symbol = symbolProvider.toSymbol(event);
1630-
// Use normal structure serializer instead of event serializer to serialize document body.
1631-
String serFunctionName = ProtocolGenerator.getSerFunctionName(symbol, context.getProtocolName());
1632-
writer.write("message.body = $L(input, context);", serFunctionName);
1653+
} else if (payloadShape instanceof StructureShape || payloadShape instanceof UnionShape) {
1654+
serializeInputEventDocumentPayload(context, payloadShape);
1655+
} else {
1656+
throw new CodegenException(String.format("Unexpected shape type bound to event payload: `%s`",
1657+
payloadShape.getType()));
16331658
}
16341659
}
16351660

0 commit comments

Comments
 (0)