|
15 | 15 |
|
16 | 16 | package software.amazon.smithy.typescript.codegen.integration;
|
17 | 17 |
|
18 |
| -import static software.amazon.smithy.model.knowledge.HttpBinding.Location; |
19 |
| - |
20 | 18 | import java.nio.file.Paths;
|
21 | 19 | import java.util.Collection;
|
22 | 20 | import java.util.Collections;
|
|
37 | 35 | import software.amazon.smithy.codegen.core.SymbolReference;
|
38 | 36 | import software.amazon.smithy.model.Model;
|
39 | 37 | import software.amazon.smithy.model.knowledge.HttpBinding;
|
| 38 | +import software.amazon.smithy.model.knowledge.HttpBinding.Location; |
40 | 39 | import software.amazon.smithy.model.knowledge.HttpBindingIndex;
|
41 | 40 | import software.amazon.smithy.model.knowledge.OperationIndex;
|
42 | 41 | import software.amazon.smithy.model.knowledge.TopDownIndex;
|
@@ -1350,6 +1349,32 @@ protected abstract void serializeInputDocumentBody(
|
1350 | 1349 | List<HttpBinding> documentBindings
|
1351 | 1350 | );
|
1352 | 1351 |
|
| 1352 | + /** |
| 1353 | + * Writes the code needed to serialize an event payload as a protocol-specific document. |
| 1354 | + * |
| 1355 | + * <p>Implementations of this method are expected to set a value to the ${@code message.body} property. |
| 1356 | + * The value set is expected to by a JavaScript ${@code Uint8Array} type and is to be encoded as the |
| 1357 | + * event payload. |
| 1358 | + * |
| 1359 | + * <p>Two parameters will be available in scope: |
| 1360 | + * <ul> |
| 1361 | + * <li>{@code message: <T>}: The partially constructed event message.</li> |
| 1362 | + * <li>{@code context: SerdeContext}: a TypeScript type containing context and tools for type serde.</li> |
| 1363 | + * </ul> |
| 1364 | + * |
| 1365 | + * <p>For example: |
| 1366 | + * |
| 1367 | + * <pre>{@code |
| 1368 | + * message.body = context.utf8Decoder(JSON.stringify(bodyParams)); |
| 1369 | + * }</pre> |
| 1370 | + * @param context The generation context. |
| 1371 | + * @param payloadShape The payload shape. Only structure and union shape is serialized as document. |
| 1372 | + */ |
| 1373 | + protected abstract void serializeInputEventDocumentPayload( |
| 1374 | + GenerationContext context, |
| 1375 | + Shape payloadShape |
| 1376 | + ); |
| 1377 | + |
1353 | 1378 | /**
|
1354 | 1379 | * Writes the code needed to serialize a protocol output document.
|
1355 | 1380 | *
|
@@ -1611,25 +1636,24 @@ private void writeEventBody(GenerationContext context, StructureShape event) {
|
1611 | 1636 | TypeScriptWriter writer = context.getWriter();
|
1612 | 1637 | Model model = context.getModel();
|
1613 | 1638 | 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)) |
| 1639 | + .filter(member -> member.hasTrait(EventPayloadTrait.class)) |
1618 | 1640 | .collect(Collectors.toList());
|
1619 |
| - if (!payloadMembers.isEmpty()) { |
1620 |
| - // Write event payload if exists. There is at most 1 payload member. |
| 1641 | + Shape payloadShape = payloadMembers.isEmpty() |
| 1642 | + ? event |
| 1643 | + : model.expectShape(payloadMembers.get(0).getTarget()); |
| 1644 | + if (payloadShape instanceof BlobShape || payloadShape instanceof StringShape) { |
| 1645 | + // Since event itself must be a structure shape, so string or blob payload member must has eventPayload |
| 1646 | + // trait explicitly. |
1621 | 1647 | MemberShape payloadMember = payloadMembers.get(0);
|
1622 |
| - String memberName = payloadMember.getMemberName(); |
| 1648 | + String payloadMemberName = payloadMember.getMemberName(); |
1623 | 1649 | writer.write("message.body = $L || message.body;",
|
1624 |
| - getInputValue(context, Location.PAYLOAD, "input." + memberName, payloadMember, |
| 1650 | + getInputValue(context, Location.PAYLOAD, "input." + payloadMemberName, payloadMember, |
1625 | 1651 | 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); |
| 1652 | + } else if (payloadShape instanceof StructureShape || payloadShape instanceof UnionShape) { |
| 1653 | + serializeInputEventDocumentPayload(context, payloadShape); |
| 1654 | + } else { |
| 1655 | + throw new CodegenException(String.format("Unexpected shape type bound to event payload: `%s`", |
| 1656 | + payloadShape.getType())); |
1633 | 1657 | }
|
1634 | 1658 | }
|
1635 | 1659 |
|
|
0 commit comments