Skip to content

Commit b72fac7

Browse files
committed
generate service specific exception class for client sdk
1 parent d2a1497 commit b72fac7

File tree

5 files changed

+139
-55
lines changed

5 files changed

+139
-55
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ private void renderStructureNamespace(StructuredMemberWriter structuredMemberWri
194194
*
195195
* <pre>{@code
196196
* import { ExceptionOptionType as __ExceptionOptionType } from "@aws-sdk/smithy-client";
197-
* import { ServiceException as __BaseException } from "@aws-sdk/smithy-client";
197+
* import { FooServiceException as __BaseException } from "./FooServiceException";
198198
* // In server SDK:
199199
* // import { ServiceException as __BaseException } from "@aws-smithy/server-common";
200200
*
@@ -220,7 +220,7 @@ private void renderErrorStructure() {
220220
Symbol symbol = symbolProvider.toSymbol(shape);
221221
writer.writeShapeDocs(shape);
222222
boolean isServerSdk = this.includeValidation;
223-
writer.openBlock("export class $L extends $L {", symbol.getName(), "__BaseException");
223+
writer.openBlock("export class $T extends $L {", symbol, "__BaseException");
224224
writer.write("readonly name: $1S = $1S;", shape.getId().getName());
225225
writer.write("readonly $$fault: $1S = $1S;", errorTrait.getValue());
226226
if (!isServerSdk) {

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

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -129,10 +129,7 @@ void writeMemberFilterSensitiveLog(TypeScriptWriter writer, MemberShape member,
129129
void writeErrorConstructor(TypeScriptWriter writer, Shape shape, boolean isServerSdk) {
130130
ErrorTrait errorTrait = shape.getTrait(ErrorTrait.class).orElseThrow(IllegalStateException::new);
131131
Symbol symbol = symbolProvider.toSymbol(shape);
132-
if (isServerSdk) {
133-
writer.addImport("ServiceException", "__BaseException", TypeScriptDependency.SERVER_COMMON.packageName);
134-
} else {
135-
writer.addImport("ServiceException", "__BaseException", TypeScriptDependency.AWS_SMITHY_CLIENT.packageName);
132+
if (!isServerSdk) {
136133
writer.writeDocs("@internal");
137134
}
138135
writer.addImport("ExceptionOptionType", "__ExceptionOptionType",

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

Lines changed: 0 additions & 48 deletions
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
/*
2+
* Copyright 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License").
5+
* You may not use this file except in compliance with the License.
6+
* A copy of the License is located at
7+
*
8+
* http://aws.amazon.com/apache2.0
9+
*
10+
* or in the "license" file accompanying this file. This file is distributed
11+
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
12+
* express or implied. See the License for the specific language governing
13+
* permissions and limitations under the License.
14+
*/
15+
16+
package software.amazon.smithy.typescript.codegen.integration;
17+
18+
import java.nio.file.Paths;
19+
import java.util.function.BiConsumer;
20+
import java.util.function.Consumer;
21+
import software.amazon.smithy.codegen.core.Symbol;
22+
import software.amazon.smithy.codegen.core.SymbolProvider;
23+
import software.amazon.smithy.codegen.core.SymbolReference;
24+
import software.amazon.smithy.model.Model;
25+
import software.amazon.smithy.model.shapes.ServiceShape;
26+
import software.amazon.smithy.model.traits.ErrorTrait;
27+
import software.amazon.smithy.typescript.codegen.CodegenUtils;
28+
import software.amazon.smithy.typescript.codegen.TypeScriptDependency;
29+
import software.amazon.smithy.typescript.codegen.TypeScriptSettings;
30+
import software.amazon.smithy.typescript.codegen.TypeScriptWriter;
31+
import software.amazon.smithy.utils.SmithyInternalApi;
32+
33+
/**
34+
* Re-export the ServiceException class from index.ts.
35+
*/
36+
@SmithyInternalApi
37+
public final class AddBaseServiceExceptionClass implements TypeScriptIntegration {
38+
39+
@Override
40+
public void writeAdditionalFiles(
41+
TypeScriptSettings settings,
42+
Model model,
43+
SymbolProvider symbolProvider,
44+
BiConsumer<String, Consumer<TypeScriptWriter>> writerFactory
45+
) {
46+
boolean isClientSdk = settings.generateClient();
47+
if (isClientSdk) {
48+
String serviceName = getServiceName(settings, model, symbolProvider);
49+
String serviceExceptionName = getServiceExceptionName(serviceName);
50+
writerFactory.accept(
51+
Paths.get(CodegenUtils.SOURCE_FOLDER, "models", serviceExceptionName + ".ts").toString(),
52+
writer -> {
53+
writer.addImport("ServiceException", "__ServiceException",
54+
TypeScriptDependency.AWS_SMITHY_CLIENT.packageName);
55+
writer.addImport("ServiceExceptionOptions", "__ServiceExceptionOptions",
56+
TypeScriptDependency.AWS_SMITHY_CLIENT.packageName);
57+
writer.writeDocs("Base exception class for all service exceptions from "
58+
+ serviceName + " service.");
59+
writer.openBlock("export class $L extends __ServiceException {", serviceExceptionName);
60+
writer.writeDocs("@internal");
61+
writer.openBlock("constructor(options: __ServiceExceptionOptions) {");
62+
writer.write("super(options);");
63+
writer.write("Object.setPrototypeOf(this, $L.prototype);", serviceExceptionName);
64+
writer.closeBlock("}"); // constructor
65+
writer.closeBlock("}"); // class
66+
});
67+
}
68+
}
69+
70+
@Override
71+
public void writeAdditionalExports(
72+
TypeScriptSettings settings,
73+
Model model,
74+
SymbolProvider symbolProvider,
75+
TypeScriptWriter writer
76+
) {
77+
boolean isClientSdk = settings.generateClient();
78+
if (isClientSdk) {
79+
String serviceName = getServiceName(settings, model, symbolProvider);
80+
String serviceExceptionName = getServiceExceptionName(serviceName);
81+
writer.write("export { $1L } from \"./models/$1L\";", serviceExceptionName);
82+
}
83+
}
84+
85+
@Override
86+
public SymbolProvider decorateSymbolProvider(
87+
TypeScriptSettings settings,
88+
Model model,
89+
SymbolProvider symbolProvider
90+
) {
91+
return shape -> {
92+
Symbol symbol = symbolProvider.toSymbol(shape);
93+
if (shape.hasTrait(ErrorTrait.class)) {
94+
String serviceName = getServiceName(settings, model, symbolProvider);
95+
String baseExceptionAlias = "__BaseException";
96+
SymbolReference reference;
97+
if (settings.generateClient()) {
98+
String serviceExceptionName = getServiceExceptionName(serviceName);
99+
String namespace = Paths.get(".", "src", "models", serviceExceptionName).toString();
100+
Symbol serviceExceptionSymbol = Symbol.builder()
101+
.putProperty("shape", shape)
102+
.name(serviceExceptionName)
103+
.namespace(namespace, "/")
104+
.definitionFile(namespace + ".ts").build();
105+
reference = SymbolReference.builder()
106+
.options(SymbolReference.ContextOption.USE)
107+
.alias(baseExceptionAlias)
108+
.symbol(serviceExceptionSymbol)
109+
.build();
110+
} else {
111+
reference = SymbolReference.builder()
112+
.options(SymbolReference.ContextOption.USE)
113+
.alias(baseExceptionAlias)
114+
.symbol(TypeScriptDependency.SERVER_COMMON.createSymbol("ServiceException"))
115+
.build();
116+
}
117+
return symbol.toBuilder().addReference(reference).build();
118+
}
119+
return symbol;
120+
};
121+
}
122+
123+
private String getServiceExceptionName(String serviceName) {
124+
return serviceName + "ServiceException";
125+
}
126+
127+
private String getServiceName(
128+
TypeScriptSettings settings,
129+
Model model,
130+
SymbolProvider symbolProvider
131+
) {
132+
ServiceShape service = settings.getService(model);
133+
return symbolProvider.toSymbol(service).getName().replaceAll("(Client)$", "");
134+
}
135+
}

smithy-typescript-codegen/src/main/resources/META-INF/services/software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@ software.amazon.smithy.typescript.codegen.integration.AddEventStreamDependency
22
software.amazon.smithy.typescript.codegen.integration.AddChecksumRequiredDependency
33
software.amazon.smithy.typescript.codegen.integration.AddDefaultsModeDependency
44
software.amazon.smithy.typescript.codegen.integration.AddHttpApiKeyAuthPlugin
5-
software.amazon.smithy.typescript.codegen.integration.AddBaseExceptionClassExport
5+
software.amazon.smithy.typescript.codegen.integration.AddBaseServiceExceptionClass

0 commit comments

Comments
 (0)