Skip to content

Commit a0a7568

Browse files
committed
consolidate ssdk and client sdk error classes
1 parent 7913ca2 commit a0a7568

File tree

9 files changed

+144
-253
lines changed

9 files changed

+144
-253
lines changed

.github/CODEOWNERS

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,5 @@ smithy-typescript-integ-tests/* @adamthom-amzn @gosar @JordonPhillips
99

1010
# These are all specific to SSDK functionality.
1111
smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/ServerCommandGenerator.java @adamthom-amzn @gosar @JordonPhillips
12-
smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/ServerErrorGenerator.java @adamthom-amzn @gosar @JordonPhillips
1312
smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/ServerGenerator.java @adamthom-amzn @gosar @JordonPhillips
1413
smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/ServerSymbolVisitor.java @adamthom-amzn @gosar @JordonPhillips

smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/CodegenVisitor.java

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -370,7 +370,6 @@ public Void serviceShape(ServiceShape shape) {
370370

371371
if (settings.generateServerSdk()) {
372372
generateServiceInterface(shape);
373-
generateServerErrors(shape);
374373
}
375374

376375
if (protocolGenerator != null) {
@@ -470,20 +469,6 @@ private void generateServiceInterface(ServiceShape shape) {
470469
});
471470
}
472471

473-
private void generateServerErrors(ServiceShape service) {
474-
final OperationIndex operationIndex = OperationIndex.of(model);
475-
476-
TopDownIndex.of(model)
477-
.getContainedOperations(service)
478-
.stream()
479-
.flatMap(o -> operationIndex.getErrors(o, service).stream())
480-
.distinct()
481-
.sorted()
482-
.forEachOrdered(error -> writers.useShapeWriter(service, symbolProvider, writer -> {
483-
new ServerErrorGenerator(settings, model, error, symbolProvider, writer).run();
484-
}));
485-
}
486-
487472
private void generateCommands(ServiceShape shape) {
488473
// Generate each operation for the service.
489474
TopDownIndex topDownIndex = TopDownIndex.of(model);

smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/ServerErrorGenerator.java

Lines changed: 0 additions & 77 deletions
This file was deleted.

smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/StructureGenerator.java

Lines changed: 55 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
import static software.amazon.smithy.typescript.codegen.CodegenUtils.getBlobStreamingMembers;
1919
import static software.amazon.smithy.typescript.codegen.CodegenUtils.writeInlineStreamingMemberType;
2020

21-
import java.util.Collection;
2221
import java.util.List;
2322
import java.util.stream.Collectors;
2423
import software.amazon.smithy.codegen.core.Symbol;
@@ -140,6 +139,40 @@ private void renderNonErrorStructure() {
140139
renderStructureNamespace(config, includeValidation);
141140
}
142141

142+
private void renderStructureNamespace(StructuredMemberWriter structuredMemberWriter, boolean includeValidation) {
143+
Symbol symbol = symbolProvider.toSymbol(shape);
144+
writer.openBlock("export namespace $L {", "}", symbol.getName(), () -> {
145+
String objectParam = "obj";
146+
writer.writeDocs("@internal");
147+
writer.openBlock("export const filterSensitiveLog = ($L: $L): any => ({", "})",
148+
objectParam, symbol.getName(),
149+
() -> {
150+
structuredMemberWriter.writeFilterSensitiveLog(writer, objectParam);
151+
}
152+
);
153+
154+
if (!includeValidation) {
155+
return;
156+
}
157+
158+
structuredMemberWriter.writeMemberValidatorCache(writer, "memberValidators");
159+
160+
writer.addImport("ValidationFailure", "__ValidationFailure", "@aws-smithy/server-common");
161+
writer.writeDocs("@internal");
162+
List<MemberShape> blobStreamingMembers = getBlobStreamingMembers(model, shape);
163+
writer.writeInline("export const validate = ($L: ", objectParam);
164+
if (blobStreamingMembers.isEmpty()) {
165+
writer.writeInline("$L", symbol.getName());
166+
} else {
167+
writeInlineStreamingMemberType(writer, symbol, blobStreamingMembers.get(0));
168+
}
169+
writer.openBlock(", path: string = \"\"): __ValidationFailure[] => {", "}", () -> {
170+
structuredMemberWriter.writeMemberValidatorFactory(writer, "memberValidators");
171+
structuredMemberWriter.writeValidateMethodContents(writer, objectParam);
172+
});
173+
});
174+
}
175+
143176
/**
144177
* Error structures generate interfaces that extend from SmithyException
145178
* and add the appropriate fault property.
@@ -159,24 +192,22 @@ private void renderNonErrorStructure() {
159192
* <p>The following TypeScript is generated:
160193
*
161194
* <pre>{@code
162-
* import { ServiceException as __ServiceException } from "@aws-sdk/smithy-client";
163-
* import { ResponseMetadata as __ResponseMetadata } from "@aws-sdk/smithy-client";
195+
* import { ServiceException as __BaseException } from "@aws-sdk/smithy-client";
196+
* import { ExceptionOptionType as __ExceptionOptionType } from "@aws-sdk/smithy-client";
164197
*
165-
* export interface NoSuchResource extends __ServiceException {
198+
* export interface NoSuchResource extends __BaseException {
166199
* name: "NoSuchResource";
167200
* $fault: "client";
168201
* resourceType: string | undefined;
169-
* }
170-
*
171-
* export class NoSuchResource extends __ServiceException {
172-
* constructor(responseMetadata: __ResponseMetadata, deserialized: any) {
202+
* // @internal
203+
* constructor(opts: __ExceptionOptionType<NoSuchResource, __BaseException>) {
173204
* super({
174205
* name: "NoSuchResource",
175206
* $fault: "client",
176-
* $metadata: responseMetadata,
207+
* ...opts
177208
* });
178209
* Object.setPrototypeOf(this, NoSuchResource.prototype);
179-
* Object.assign(this, { ...deserialized });
210+
* this.resourceType = opts.resourceType;
180211
* }
181212
* }
182213
* }</pre>
@@ -185,74 +216,21 @@ private void renderErrorStructure() {
185216
ErrorTrait errorTrait = shape.getTrait(ErrorTrait.class).orElseThrow(IllegalStateException::new);
186217
Symbol symbol = symbolProvider.toSymbol(shape);
187218
writer.writeShapeDocs(shape);
188-
189-
writer.addImport("ResponseMetadata", "__ResponseMetadata", "@aws-sdk/types");
190-
writer.addImport("ServiceException", "__ServiceException", "@aws-sdk/smithy-client");
191-
192-
writer.openBlock("export interface $L extends __ServiceException {", symbol.getName());
193-
writer.write("name: $S;", shape.getId().getName());
194-
writer.write("$$fault: $S;", errorTrait.getValue());
195-
HttpProtocolGeneratorUtils.writeRetryableTrait(writer, shape, ";");
196-
Collection<MemberShape> allMembers = shape.getAllMembers().values().stream().filter((memberShape) -> {
197-
// since any error interface must extend from JavaScript Error interface, message member is already required
198-
// in the JavaScript Error interface
199-
String memberName = memberShape.getMemberName();
200-
return !memberName.equals("message");
201-
}).collect(Collectors.toList());
202-
StructuredMemberWriter structuredMemberWriter = new StructuredMemberWriter(model, symbolProvider, allMembers);
219+
boolean isServerSdk = this.includeValidation;
220+
writer.openBlock("export class $L extends $L {", symbol.getName(), "__BaseException");
221+
writer.write("readonly name: $1S = $1S;", shape.getId().getName());
222+
writer.write("readonly $$fault: $1S = $1S;", errorTrait.getValue());
223+
if (!isServerSdk) {
224+
HttpProtocolGeneratorUtils.writeRetryableTrait(writer, shape, ";");
225+
}
226+
StructuredMemberWriter structuredMemberWriter = new StructuredMemberWriter(model, symbolProvider,
227+
shape.getAllMembers().values());
228+
// since any error interface must extend from JavaScript Error interface, message member is already
229+
// required in the JavaScript Error interface
230+
structuredMemberWriter.skipMembers.add("message");
203231
structuredMemberWriter.writeMembers(writer, shape);
204-
writer.closeBlock("}"); // interface
205-
writer.write("");
206-
renderErrorStructureClass(symbol, errorTrait);
232+
structuredMemberWriter.writeErrorConstructor(writer, shape, isServerSdk);
233+
writer.closeBlock("}");
207234
writer.write("");
208235
}
209-
210-
private void renderErrorStructureClass(Symbol symbol, ErrorTrait errorTrait) {
211-
writer.openBlock("export class $L extends __ServiceException {", symbol.getName());
212-
writer.addImport("ResponseMetadata", "__ResponseMetadata", "@aws-sdk/types");
213-
writer.openBlock("constructor(responseMetadata: __ResponseMetadata, deserialized: any) {", "}", () -> {
214-
writer.openBlock("super({", "});", () -> {
215-
writer.write("name: $S,", shape.getId().getName());
216-
writer.write("$$fault: $S,", errorTrait.getValue());
217-
writer.write("$$metadata: responseMetadata,");
218-
});
219-
writer.write("Object.setPrototypeOf(this, $L.prototype);", symbol.getName());
220-
writer.write("Object.assign(this, { ...deserialized });");
221-
});
222-
writer.closeBlock("}"); // class
223-
}
224-
225-
private void renderStructureNamespace(StructuredMemberWriter structuredMemberWriter, boolean includeValidation) {
226-
Symbol symbol = symbolProvider.toSymbol(shape);
227-
writer.openBlock("export namespace $L {", "}", symbol.getName(), () -> {
228-
String objectParam = "obj";
229-
writer.writeDocs("@internal");
230-
writer.openBlock("export const filterSensitiveLog = ($L: $L): any => ({", "})",
231-
objectParam, symbol.getName(),
232-
() -> {
233-
structuredMemberWriter.writeFilterSensitiveLog(writer, objectParam);
234-
}
235-
);
236-
237-
if (!includeValidation) {
238-
return;
239-
}
240-
241-
structuredMemberWriter.writeMemberValidatorCache(writer, "memberValidators");
242-
243-
writer.addImport("ValidationFailure", "__ValidationFailure", "@aws-smithy/server-common");
244-
writer.writeDocs("@internal");
245-
List<MemberShape> blobStreamingMembers = getBlobStreamingMembers(model, shape);
246-
writer.writeInline("export const validate = ($L: ", objectParam);
247-
if (blobStreamingMembers.isEmpty()) {
248-
writer.writeInline("$L", symbol.getName());
249-
} else {
250-
writeInlineStreamingMemberType(writer, symbol, blobStreamingMembers.get(0));
251-
}
252-
writer.openBlock(", path: string = \"\"): __ValidationFailure[] => {", "}", () -> {
253-
structuredMemberWriter.writeMemberValidatorFactory(writer, "memberValidators");
254-
structuredMemberWriter.writeValidateMethodContents(writer, objectParam);
255-
});
256-
});
257-
}
258236
}

smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/StructuredMemberWriter.java

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -124,22 +124,32 @@ void writeMemberFilterSensitiveLog(TypeScriptWriter writer, MemberShape member,
124124
}
125125

126126
/**
127-
* Writes a constructor function that takes in an object allowing modeled fields to be initialized.
127+
* Writes constructor of SDK exception classes.
128128
*/
129-
void writeConstructor(TypeScriptWriter writer, Shape shape) {
130-
writer.openBlock("constructor(opts: {", "}) {", () -> {
131-
writeMembers(writer, shape);
129+
void writeErrorConstructor(TypeScriptWriter writer, Shape shape, boolean isServerSdk) {
130+
ErrorTrait errorTrait = shape.getTrait(ErrorTrait.class).orElseThrow(IllegalStateException::new);
131+
Symbol symbol = symbolProvider.toSymbol(shape);
132+
if (isServerSdk) {
133+
// TODO: change to import from @aws-smithy/server-common
134+
writer.addImport("ClientException", "__BaseException", "@aws-sdk/smithy-client");
135+
} else {
136+
writer.addImport("ServiceException", "__BaseException", "@aws-sdk/smithy-client");
137+
writer.writeDocs("@internal");
138+
}
139+
writer.addImport("ExceptionOptionType", "__ExceptionOptionType", "@aws-sdk/smithy-client");
140+
writer.openBlock("constructor(opts: __ExceptionOptionType<$L, __BaseException>) {", symbol.getName());
141+
writer.openBlock("super({", "});", () -> {
142+
writer.write("name: $S,", shape.getId().getName());
143+
writer.write("$$fault: $S,", errorTrait.getValue());
144+
writer.write("...opts");
132145
});
133-
writer.indent();
134-
146+
writer.write("Object.setPrototypeOf(this, $L.prototype);", symbol.getName());
135147
for (MemberShape member : members) {
136148
if (skipMembers.contains(member.getMemberName())) {
137149
continue;
138150
}
139-
140151
writer.write("this.${1L} = opts.${1L};", getSanitizedMemberName(member));
141152
}
142-
143153
writer.closeBlock("}");
144154
}
145155

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2071,13 +2071,14 @@ private void generateErrorDeserializer(GenerationContext context, StructureShape
20712071
Shape target = model.expectShape(binding.getMember().getTarget());
20722072
deserializingDocumentShapes.add(target);
20732073
});
2074-
writer.openBlock("const exception = new $T(", ");", errorSymbol, () -> {
2075-
writer.write("deserializeMetadata($L),", outputName);
2076-
writer.write("contents");
2074+
writer.openBlock("const exception = new $T({", "});", errorSymbol, () -> {
2075+
writer.write("$$metadata: deserializeMetadata($L),", outputName);
2076+
writer.write("...contents");
20772077
});
2078+
String errorLocation = this.getErrorBodyLocation(context, "parsedBody");
20782079
writer.addImport("decorateServiceException", "__decorateServiceException",
20792080
TypeScriptDependency.AWS_SMITHY_CLIENT.packageName);
2080-
writer.write("return __decorateServiceException(exception);");
2081+
writer.write("return __decorateServiceException(exception, $L);", errorLocation);
20812082
});
20822083

20832084
writer.write("");

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,7 @@ public static void writeRetryableTrait(TypeScriptWriter writer, StructureShape e
291291
Optional<RetryableTrait> retryableTrait = error.getTrait(RetryableTrait.class);
292292
if (retryableTrait.isPresent()) {
293293
String textAfterBlock = String.format("}%s", separator);
294-
writer.openBlock("$$retryable: {", textAfterBlock, () -> {
294+
writer.openBlock("$$retryable = {", textAfterBlock, () -> {
295295
if (retryableTrait.get().getThrottling()) {
296296
writer.write("throttling: true,");
297297
}

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -406,13 +406,13 @@ private void generateErrorDeserializer(GenerationContext context, StructureShape
406406
getErrorBodyLocation(context, "body"));
407407

408408
// Then load it into the object with additional error and response properties.
409-
writer.openBlock("const exception = new $T(", ");", errorSymbol, () -> {
410-
writer.write("deserializeMetadata($L),", outputReference);
411-
writer.write("deserialized");
409+
writer.openBlock("const exception = new $T({", "});", errorSymbol, () -> {
410+
writer.write("$$metadata: deserializeMetadata($L),", outputReference);
411+
writer.write("...deserialized");
412412
});
413413
writer.addImport("decorateServiceException", "__decorateServiceException",
414414
TypeScriptDependency.AWS_SMITHY_CLIENT.packageName);
415-
writer.write("return __decorateServiceException(exception);");
415+
writer.write("return __decorateServiceException(exception, body);");
416416
});
417417

418418
writer.write("");

0 commit comments

Comments
 (0)