|
19 | 19 |
|
20 | 20 | import java.util.Comparator;
|
21 | 21 | import java.util.List;
|
| 22 | +import java.util.Optional; |
22 | 23 | import java.util.Set;
|
23 | 24 | import java.util.TreeMap;
|
24 | 25 | import java.util.TreeSet;
|
25 | 26 | import java.util.logging.Logger;
|
| 27 | + |
26 | 28 | import software.amazon.smithy.codegen.core.CodegenException;
|
27 | 29 | import software.amazon.smithy.codegen.core.Symbol;
|
28 | 30 | import software.amazon.smithy.codegen.core.SymbolProvider;
|
29 | 31 | import software.amazon.smithy.codegen.core.SymbolReference;
|
30 | 32 | import software.amazon.smithy.model.knowledge.HttpBinding;
|
31 | 33 | import software.amazon.smithy.model.knowledge.HttpBindingIndex;
|
| 34 | +import software.amazon.smithy.model.knowledge.OperationIndex; |
32 | 35 | import software.amazon.smithy.model.knowledge.TopDownIndex;
|
33 | 36 | import software.amazon.smithy.model.shapes.BlobShape;
|
34 | 37 | import software.amazon.smithy.model.shapes.BooleanShape;
|
@@ -662,11 +665,17 @@ private List<HttpBinding> readResponseBody(
|
662 | 665 | documentBindings.sort(Comparator.comparing(HttpBinding::getMemberName));
|
663 | 666 | List<HttpBinding> payloadBindings = bindingIndex.getResponseBindings(operationOrError, Location.PAYLOAD);
|
664 | 667 |
|
665 |
| - if (operationOrError.isOperationShape() && !payloadBindings.get(0).getMember().hasTrait(StreamingTrait.class)) { |
666 |
| - writer.write("const data: any = await parseBody(output.body, context)"); |
667 |
| - } else { |
668 |
| - // Don't collect stream for errors and streaming payload |
| 668 | + OperationIndex operationIndex = context.getModel().getKnowledge(OperationIndex.class); |
| 669 | + StructureShape operationOutputOrError = operationOrError.asStructureShape() |
| 670 | + .orElseGet(() -> operationIndex.getOutput(operationOrError).orElse(null)); |
| 671 | + boolean hasStreamingComponent = Optional.ofNullable(operationOutputOrError) |
| 672 | + .map(structure -> structure.getAllMembers().values().stream() |
| 673 | + .anyMatch(memberShape -> memberShape.hasTrait(StreamingTrait.class))) |
| 674 | + .orElse(false); |
| 675 | + if (hasStreamingComponent) { |
669 | 676 | writer.write("const data: any = output.body;");
|
| 677 | + } else { |
| 678 | + writer.write("const data: any = await parseBody(output.body, context);"); |
670 | 679 | }
|
671 | 680 |
|
672 | 681 | if (!documentBindings.isEmpty()) {
|
|
0 commit comments