Skip to content

Commit 42751c8

Browse files
committed
use normal error deserializer to deserialize error event in event stream
1 parent e9da31a commit 42751c8

File tree

1 file changed

+35
-8
lines changed

1 file changed

+35
-8
lines changed

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

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1091,17 +1091,44 @@ private void generateEventDeserializer(GenerationContext context, StructureShape
10911091
+ " output: any,\n"
10921092
+ " context: __SerdeContext\n"
10931093
+ "): Promise<$T> => {", "}", methodName, symbol, () -> {
1094-
writer.openBlock("let contents: $L = {", "} as any;", symbol.getName(), () -> {
1095-
if (!event.getAllMembers().values().isEmpty()) {
1096-
writer.write("__type: $S,", event.getId().getName());
1097-
}
1098-
});
1099-
readEventHeaders(context, event);
1100-
readEventBody(context, event);
1101-
writer.write("return contents;");
1094+
if (event.hasTrait(ErrorTrait.class)) {
1095+
generateErrorEventDeserializer(context, event);
1096+
} else {
1097+
writer.openBlock("let contents: $L = {", "} as any;", symbol.getName(), () -> {
1098+
if (!event.getAllMembers().values().isEmpty()) {
1099+
writer.write("__type: $S,", event.getId().getName());
1100+
}
1101+
});
1102+
readEventHeaders(context, event);
1103+
readEventBody(context, event);
1104+
writer.write("return contents;");
1105+
}
11021106
});
11031107
}
11041108

1109+
// Writes function content that deserialize error event with error deserializer
1110+
private void generateErrorEventDeserializer(GenerationContext context, StructureShape event) {
1111+
TypeScriptWriter writer = context.getWriter();
1112+
SymbolProvider symbolProvider = context.getSymbolProvider();
1113+
// If this is an error event, we need to generate the error deserializer.
1114+
deserializingErrorShapes.add(event);
1115+
Symbol errorSymbol = symbolProvider.toSymbol(event);
1116+
String errorDeserMethodName = ProtocolGenerator.getDeserFunctionName(errorSymbol,
1117+
context.getProtocolName()) + "Response";
1118+
if (isErrorCodeInBody) {
1119+
// If error code is in body, parseBody() won't be called inside error deser. So we parse body here.
1120+
// It's ok to parse body here because body won't be streaming if 'isErrorCodeInBody' is set.
1121+
writer.openBlock("const parsedOutput: any = {", "};",
1122+
() -> {
1123+
writer.write("...output,");
1124+
writer.write("body: await parseBody(output.body, context)");
1125+
});
1126+
writer.write("return $L(parsedOutput, context);", errorDeserMethodName);
1127+
} else {
1128+
writer.write("return $L(output, context);", errorDeserMethodName);
1129+
}
1130+
}
1131+
11051132
// Parse members from event headers.
11061133
private void readEventHeaders(GenerationContext context, StructureShape event) {
11071134
TypeScriptWriter writer = context.getWriter();

0 commit comments

Comments
 (0)