Skip to content

Commit deed209

Browse files
chore: differentiate serde between servers and clients (#2220)
* chore: update rest-json abstract methods * chore: differentiate restJson1 empty body behavior This adds differentation for empty body behavior in restJson1. For responses this protocol requires always sending an empty json object if there is some shape defined as output but nothing bound to the body or payload. * chore: don't pass in an isInput bool * chore: public -> protected
1 parent f164177 commit deed209

File tree

2 files changed

+210
-16
lines changed

2 files changed

+210
-16
lines changed

codegen/smithy-aws-typescript-codegen/src/main/java/software/amazon/smithy/aws/typescript/codegen/AwsRestXml.java

+82-5
Original file line numberDiff line numberDiff line change
@@ -139,16 +139,40 @@ private boolean usesWrappedErrorResponse(GenerationContext context) {
139139
}
140140

141141
@Override
142-
protected void writeDefaultHeaders(GenerationContext context, OperationShape operation) {
143-
super.writeDefaultHeaders(context, operation);
142+
protected void writeDefaultInputHeaders(GenerationContext context, OperationShape operation) {
144143
AwsProtocolUtils.generateUnsignedPayloadSigV4Header(context, operation);
145144
}
146145

147146
@Override
148-
protected void serializeInputDocument(
147+
protected void serializeInputDocumentBody(
149148
GenerationContext context,
150149
OperationShape operation,
151150
List<HttpBinding> documentBindings
151+
) {
152+
serializeDocumentBody(context, documentBindings);
153+
}
154+
155+
@Override
156+
protected void serializeOutputDocumentBody(
157+
GenerationContext context,
158+
OperationShape operation,
159+
List<HttpBinding> documentBindings
160+
) {
161+
serializeDocumentBody(context, documentBindings);
162+
}
163+
164+
@Override
165+
protected void serializeErrorDocumentBody(
166+
GenerationContext context,
167+
StructureShape error,
168+
List<HttpBinding> documentBindings
169+
) {
170+
serializeDocumentBody(context, documentBindings);
171+
}
172+
173+
private void serializeDocumentBody(
174+
GenerationContext context,
175+
List<HttpBinding> documentBindings
152176
) {
153177
// Short circuit when we have no bindings.
154178
TypeScriptWriter writer = context.getWriter();
@@ -205,6 +229,34 @@ protected void serializeInputPayload(
205229
GenerationContext context,
206230
OperationShape operation,
207231
HttpBinding payloadBinding
232+
) {
233+
super.serializeInputPayload(context, operation, payloadBinding);
234+
serializePayload(context, payloadBinding);
235+
}
236+
237+
@Override
238+
protected void serializeOutputPayload(
239+
GenerationContext context,
240+
OperationShape operation,
241+
HttpBinding payloadBinding
242+
) {
243+
super.serializeOutputPayload(context, operation, payloadBinding);
244+
serializePayload(context, payloadBinding);
245+
}
246+
247+
@Override
248+
protected void serializeErrorPayload(
249+
GenerationContext context,
250+
StructureShape error,
251+
HttpBinding payloadBinding
252+
) {
253+
super.serializeErrorPayload(context, error, payloadBinding);
254+
serializePayload(context, payloadBinding);
255+
}
256+
257+
private void serializePayload(
258+
GenerationContext context,
259+
HttpBinding payloadBinding
208260
) {
209261
SymbolProvider symbolProvider = context.getSymbolProvider();
210262
TypeScriptWriter writer = context.getWriter();
@@ -252,9 +304,34 @@ protected void writeErrorCodeParser(GenerationContext context) {
252304
}
253305

254306
@Override
255-
protected void deserializeOutputDocument(
307+
protected void deserializeInputDocumentBody(
308+
GenerationContext context,
309+
OperationShape operation,
310+
List<HttpBinding> documentBindings
311+
) {
312+
deserializeDocumentBody(context, documentBindings);
313+
}
314+
315+
@Override
316+
protected void deserializeOutputDocumentBody(
317+
GenerationContext context,
318+
OperationShape operation,
319+
List<HttpBinding> documentBindings
320+
) {
321+
deserializeDocumentBody(context, documentBindings);
322+
}
323+
324+
@Override
325+
protected void deserializeErrorDocumentBody(
326+
GenerationContext context,
327+
StructureShape error,
328+
List<HttpBinding> documentBindings
329+
) {
330+
deserializeDocumentBody(context, documentBindings);
331+
}
332+
333+
private void deserializeDocumentBody(
256334
GenerationContext context,
257-
Shape operationOrError,
258335
List<HttpBinding> documentBindings
259336
) {
260337
SymbolProvider symbolProvider = context.getSymbolProvider();

codegen/smithy-aws-typescript-codegen/src/main/java/software/amazon/smithy/aws/typescript/codegen/RestJsonProtocolGenerator.java

+128-11
Original file line numberDiff line numberDiff line change
@@ -87,19 +87,17 @@ public void generateSharedComponents(GenerationContext context) {
8787
}
8888

8989
@Override
90-
protected void writeDefaultHeaders(GenerationContext context, OperationShape operation) {
91-
super.writeDefaultHeaders(context, operation);
90+
protected void writeDefaultInputHeaders(GenerationContext context, OperationShape operation) {
9291
AwsProtocolUtils.generateUnsignedPayloadSigV4Header(context, operation);
9392
}
9493

9594
@Override
9695
protected void writeDefaultErrorHeaders(GenerationContext context, StructureShape error) {
97-
super.writeDefaultErrorHeaders(context, error);
9896
context.getWriter().write("'x-amzn-errortype': $S,", error.getId().getName());
9997
}
10098

10199
@Override
102-
public void serializeInputDocument(
100+
protected void serializeInputDocumentBody(
103101
GenerationContext context,
104102
OperationShape operation,
105103
List<HttpBinding> documentBindings
@@ -110,7 +108,41 @@ public void serializeInputDocument(
110108
writer.write("body = \"\";");
111109
return;
112110
}
111+
serializeDocumentBody(context, documentBindings);
112+
}
113+
114+
@Override
115+
protected void serializeOutputDocumentBody(
116+
GenerationContext context,
117+
OperationShape operation,
118+
List<HttpBinding> documentBindings
119+
) {
120+
// Short circuit when we have no bindings.
121+
TypeScriptWriter writer = context.getWriter();
122+
if (documentBindings.isEmpty()) {
123+
writer.write("body = \"{}\";");
124+
return;
125+
}
126+
serializeDocumentBody(context, documentBindings);
127+
}
128+
129+
@Override
130+
protected void serializeErrorDocumentBody(
131+
GenerationContext context,
132+
StructureShape error,
133+
List<HttpBinding> documentBindings
134+
) {
135+
// Short circuit when we have no bindings.
136+
TypeScriptWriter writer = context.getWriter();
137+
if (documentBindings.isEmpty()) {
138+
writer.write("body = \"{}\";");
139+
return;
140+
}
141+
serializeDocumentBody(context, documentBindings);
142+
}
113143

144+
private void serializeDocumentBody(GenerationContext context, List<HttpBinding> documentBindings) {
145+
TypeScriptWriter writer = context.getWriter();
114146
SymbolProvider symbolProvider = context.getSymbolProvider();
115147

116148
writer.openBlock("body = JSON.stringify({", "});", () -> {
@@ -147,9 +179,34 @@ protected void serializeInputPayload(
147179
OperationShape operation,
148180
HttpBinding payloadBinding
149181
) {
150-
// We want the standard serialization, but need to alter it to JSON.
151182
super.serializeInputPayload(context, operation, payloadBinding);
183+
serializePayload(context, payloadBinding);
184+
}
185+
186+
@Override
187+
protected void serializeOutputPayload(
188+
GenerationContext context,
189+
OperationShape operation,
190+
HttpBinding payloadBinding
191+
) {
192+
super.serializeOutputPayload(context, operation, payloadBinding);
193+
serializePayload(context, payloadBinding);
194+
}
152195

196+
@Override
197+
protected void serializeErrorPayload(
198+
GenerationContext context,
199+
StructureShape error,
200+
HttpBinding payloadBinding
201+
) {
202+
super.serializeErrorPayload(context, error, payloadBinding);
203+
serializePayload(context, payloadBinding);
204+
}
205+
206+
private void serializePayload(
207+
GenerationContext context,
208+
HttpBinding payloadBinding
209+
) {
153210
TypeScriptWriter writer = context.getWriter();
154211
MemberShape payloadMember = payloadBinding.getMember();
155212
Shape target = context.getModel().expectShape(payloadMember.getTarget());
@@ -172,6 +229,11 @@ private DocumentMemberSerVisitor getMemberSerVisitor(GenerationContext context,
172229
return new JsonMemberSerVisitor(context, dataSource, getDocumentTimestampFormat());
173230
}
174231

232+
protected boolean shouldWriteDefaultOutputBody(GenerationContext context, OperationShape operation) {
233+
// Operations that have any defined output shape should always send a default body.
234+
return operation.getOutput().isPresent();
235+
}
236+
175237
@Override
176238
protected void writeErrorCodeParser(GenerationContext context) {
177239
TypeScriptWriter writer = context.getWriter();
@@ -181,9 +243,34 @@ protected void writeErrorCodeParser(GenerationContext context) {
181243
}
182244

183245
@Override
184-
public void deserializeOutputDocument(
246+
protected void deserializeInputDocumentBody(
247+
GenerationContext context,
248+
OperationShape operation,
249+
List<HttpBinding> documentBindings
250+
) {
251+
deserializeDocumentBody(context, documentBindings);
252+
}
253+
254+
@Override
255+
protected void deserializeOutputDocumentBody(
256+
GenerationContext context,
257+
OperationShape operation,
258+
List<HttpBinding> documentBindings
259+
) {
260+
deserializeDocumentBody(context, documentBindings);
261+
}
262+
263+
@Override
264+
protected void deserializeErrorDocumentBody(
265+
GenerationContext context,
266+
StructureShape error,
267+
List<HttpBinding> documentBindings
268+
) {
269+
deserializeDocumentBody(context, documentBindings);
270+
}
271+
272+
private void deserializeDocumentBody(
185273
GenerationContext context,
186-
Shape operationOrError,
187274
List<HttpBinding> documentBindings
188275
) {
189276
TypeScriptWriter writer = context.getWriter();
@@ -205,20 +292,50 @@ public void deserializeOutputDocument(
205292
}
206293
}
207294

208-
protected HttpBinding readResponsePayload(
295+
@Override
296+
protected HttpBinding deserializeInputPayload(
297+
GenerationContext context,
298+
OperationShape operation,
299+
HttpBinding payloadBinding
300+
) {
301+
HttpBinding returnedBinding = super.deserializeInputPayload(context, operation, payloadBinding);
302+
readPayload(context, payloadBinding);
303+
return returnedBinding;
304+
}
305+
306+
@Override
307+
protected HttpBinding deserializeOutputPayload(
308+
GenerationContext context,
309+
OperationShape operation,
310+
HttpBinding payloadBinding
311+
) {
312+
HttpBinding returnedBinding = super.deserializeOutputPayload(context, operation, payloadBinding);
313+
readPayload(context, payloadBinding);
314+
return returnedBinding;
315+
}
316+
317+
@Override
318+
protected HttpBinding deserializeErrorPayload(
319+
GenerationContext context,
320+
StructureShape error,
321+
HttpBinding payloadBinding
322+
) {
323+
HttpBinding returnedBinding = super.deserializeErrorPayload(context, error, payloadBinding);
324+
readPayload(context, payloadBinding);
325+
return returnedBinding;
326+
}
327+
328+
protected void readPayload(
209329
GenerationContext context,
210330
HttpBinding payloadBinding
211331
) {
212-
HttpBinding returnedBinding = super.readResponsePayload(context, payloadBinding);
213332
TypeScriptWriter writer = context.getWriter();
214333
Shape target = context.getModel().expectShape(payloadBinding.getMember().getTarget());
215334

216335
// Decode the body from a JSON string.
217336
if (target instanceof DocumentShape) {
218337
writer.write("contents.$L = JSON.parse(data);", payloadBinding.getMemberName());
219338
}
220-
221-
return returnedBinding;
222339
}
223340

224341
private DocumentMemberDeserVisitor getMemberDeserVisitor(GenerationContext context, String dataSource) {

0 commit comments

Comments
 (0)