@@ -1091,17 +1091,44 @@ private void generateEventDeserializer(GenerationContext context, StructureShape
1091
1091
+ " output: any,\n "
1092
1092
+ " context: __SerdeContext\n "
1093
1093
+ "): 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
+ }
1102
1106
});
1103
1107
}
1104
1108
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
+
1105
1132
// Parse members from event headers.
1106
1133
private void readEventHeaders (GenerationContext context , StructureShape event ) {
1107
1134
TypeScriptWriter writer = context .getWriter ();
0 commit comments