Skip to content

Commit afd97d2

Browse files
committed
Update to SerdeContext
This commit updates Command and Protocol generation to match expected, consolidated SerdeContext instead of distinct (de)serializers. It also fixes issues in writing the serde dispatch.
1 parent fd9c923 commit afd97d2

File tree

4 files changed

+28
-30
lines changed

4 files changed

+28
-30
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ static ApplicationProtocol resolve(
9696
ServiceShape service,
9797
Collection<TypeScriptIntegration> integrations
9898
) {
99+
// TODO If we're going to need to resolve this more than once, store it.
99100
List<String> resolvedProtocols = settings.resolveServiceProtocols(service);
100101
// Get the list of protocol generators that have implementations from the service.
101102
List<ProtocolGenerator> generators = integrations.stream()

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

Lines changed: 21 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -89,14 +89,14 @@ public void run() {
8989
writer.addImport("ServiceInputTypes", "ServiceInputTypes", serviceSymbol.getNamespace());
9090
writer.addImport("ServiceOutputTypes", "ServiceOutputTypes", serviceSymbol.getNamespace());
9191
writer.addImport("Command", "$Command", "@aws-sdk/smithy-client");
92-
writer.addImport("*", "$types", "@aws-sdk/types");
92+
writer.addImport("FinalizeHandlerArguments", "FinalizeHandlerArguments", "@aws-sdk/types");
93+
writer.addImport("Handler", "Handler", "@aws-sdk/types");
94+
writer.addImport("HandlerExecutionContext", "HandlerExecutionContext", "@aws-sdk/types");
95+
writer.addImport("MiddlewareStack", "MiddlewareStack", "@aws-sdk/types");
96+
writer.addImport("SerdeContext", "SerdeContext", "@aws-sdk/types");
9397

9498
addInputAndOutputTypes();
9599

96-
// This "Utils" type is used when serializing and deserializing commands. It
97-
// provides various platform specific methods that serde needs.
98-
writer.write("type Utils = { [key: string]: any };").write("");
99-
100100
String name = symbol.getName();
101101
writer.openBlock("export class $L extends $$Command<$L, $L> {", "}", name, inputType, outputType, () -> {
102102

@@ -126,17 +126,13 @@ private void generateCommandConstructor() {
126126
.pushState(COMMAND_CONSTRUCTOR_SECTION)
127127
.write("super();")
128128
.popState()
129-
.write("// Start section: $L", COMMAND_CONSTRUCTOR_SECTION);
129+
.write("// End section: $L", COMMAND_CONSTRUCTOR_SECTION);
130130
});
131131
}
132132

133133
private void generateCommandMiddlewareResolver(String configType) {
134-
Symbol ser = Symbol.builder()
135-
.name("serializerPlugin")
136-
.namespace("@aws-sdk/middleware-serde", "/")
137-
.build();
138-
Symbol deser = Symbol.builder()
139-
.name("deserializerPlugin")
134+
Symbol serde = Symbol.builder()
135+
.name("serdePlugin")
140136
.namespace("@aws-sdk/middleware-serde", "/")
141137
.addDependency(PackageJsonGenerator.NORMAL_DEPENDENCY,
142138
"@aws-sdk/middleware-serde",
@@ -145,26 +141,25 @@ private void generateCommandMiddlewareResolver(String configType) {
145141

146142
writer.write("resolveMiddleware(")
147143
.indent()
148-
.write("clientStack: $$types.MiddlewareStack<$L, $L>,", inputType, outputType)
144+
.write("clientStack: MiddlewareStack<$L, $L>,", inputType, outputType)
149145
.write("configuration: $L,", configType)
150146
.write("options?: $T", applicationProtocol.getOptionsType())
151147
.dedent();
152-
writer.openBlock("): $$types.Handler<$L, $L> {", "}", inputType, outputType, () -> {
153-
// Add serialization and deserialization plugins.
154-
writer.write("this.use($T(configuration, this.serialize));", ser);
155-
writer.write("this.use($T<$L>(configuration, this.deserialize));", deser, outputType);
148+
writer.openBlock("): Handler<$L, $L> {", "}", inputType, outputType, () -> {
149+
// Add serialization and deserialization plugin.
150+
writer.write("this.use($T(configuration, this.serialize, this.deserialize));", serde);
156151

157152
// Add customizations.
158153
addCommandSpecificPlugins();
159154

160155
// Resolve the middleware stack.
161156
writer.write("\nconst stack = clientStack.concat(this.middlewareStack);\n");
162-
writer.openBlock("const handlerExecutionContext: $$types.HandlerExecutionContext = {", "}", () -> {
157+
writer.openBlock("const handlerExecutionContext: HandlerExecutionContext = {", "}", () -> {
163158
writer.write("logger: {} as any,");
164159
});
165160
writer.write("const { httpHandler } = configuration;");
166161
writer.openBlock("return stack.resolve(", ");", () -> {
167-
writer.write("(request: $$types.FinalizeHandlerArguments<any>) => ");
162+
writer.write("(request: FinalizeHandlerArguments<any>) => ");
168163
writer.write(" httpHandler.handle(request.request as $T, options || {}),",
169164
applicationProtocol.getRequestType());
170165
writer.write("handlerExecutionContext");
@@ -205,7 +200,7 @@ private void writeSerde() {
205200
.indent()
206201
.write("input: $L,", inputType)
207202
.write("protocol: string,")
208-
.write("utils?: Utils")
203+
.write("context: SerdeContext")
209204
.dedent()
210205
.openBlock("): $T {", "}", applicationProtocol.getRequestType(), () -> writeSerdeDispatcher("input"));
211206

@@ -214,7 +209,7 @@ private void writeSerde() {
214209
.indent()
215210
.write("output: $T,", applicationProtocol.getResponseType())
216211
.write("protocol: string,")
217-
.write("utils?: Utils")
212+
.write("context: SerdeContext")
218213
.dedent()
219214
.openBlock("): Promise<$L> {", "}", outputType, () -> writeSerdeDispatcher("output"))
220215
.write("");
@@ -226,11 +221,13 @@ private void writeSerdeDispatcher(String inputOrOutput) {
226221
// For example:
227222
// case 'aws.rest-json-1.1':
228223
// return getFooCommandAws_RestJson1_1Serialize(input, utils);
229-
//
230-
for (String protocol : settings.getProtocols()) {
224+
// TODO Validate this is the right set of protocols; settings.protocols was empty here.
225+
for (String protocol : settings.resolveServiceProtocols(service)) {
231226
String serdeFunctionName = getSerdeFunctionName(symbol, protocol, inputOrOutput);
227+
writer.addImport(serdeFunctionName, serdeFunctionName,
228+
"./protocols/" + ProtocolGenerator.getSanitizedName(protocol));
232229
writer.write("case '$L':", protocol)
233-
.write(" return $L($L, utils);", serdeFunctionName, inputOrOutput);
230+
.write(" return $L($L, context);", serdeFunctionName, inputOrOutput);
234231
}
235232

236233
writer.write("default:")

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ public ServiceShape getService(Model model) {
189189
/**
190190
* Gets the explicitly configured list of protocols to generate.
191191
*
192-
* <p>Every returned protocol must utilize compatibke application protocols.
192+
* <p>Every returned protocol must utilize compatible application protocols.
193193
*
194194
* @return Returns the configured list of protocols or an empty list.
195195
*/

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ private void generateOperationSerializer(GenerationContext context, OperationSha
8989

9090
// Ensure that the request type is imported.
9191
writer.addUseImports(requestType);
92-
writer.addImport("SerializerUtils", "SerializerUtils", "@aws-sdk/types");
92+
writer.addImport("SerdeContext", "SerdeContext", "@aws-sdk/types");
9393
writer.addImport("Endpoint", "__Endpoint", "@aws-sdk/types");
9494
// e.g., serializeAws_restJson1_1ExecuteStatement
9595
String serializerMethodName = "serialize" + ProtocolGenerator.getSanitizedName(getName()) + symbol.getName();
@@ -99,15 +99,15 @@ private void generateOperationSerializer(GenerationContext context, OperationSha
9999

100100
writer.openBlock("export function $L(\n"
101101
+ " input: $L,\n"
102-
+ " utils: SerializerUtils\n"
102+
+ " context: SerdeContext\n"
103103
+ "): $T {", "}", serializerMethodName, inputType, requestType, () -> {
104104
List<HttpBinding> labelBindings = writeRequestLabels(context, operation, bindingIndex, trait);
105105
List<HttpBinding> queryBindings = writeRequestQueryString(context, operation, bindingIndex);
106106
writeHeaders(context, operation, bindingIndex);
107107
List<HttpBinding> documentBindings = writeRequestBody(context, operation, bindingIndex);
108108

109109
writer.openBlock("return new $T({", "});", requestType, () -> {
110-
writer.write("...utils.endpoint,");
110+
writer.write("...context.endpoint,");
111111
writer.write("protocol: \"https\",");
112112
writer.write("method: $S,", trait.getMethod());
113113
if (labelBindings.isEmpty()) {
@@ -310,7 +310,7 @@ private void generateOperationDeserializer(GenerationContext context, OperationS
310310

311311
// Ensure that the response type is imported.
312312
writer.addUseImports(responseType);
313-
writer.addImport("DeserializerUtils", "DeserializerUtils", "@aws-sdk/types");
313+
writer.addImport("SerdeContext", "SerdeContext", "@aws-sdk/types");
314314
// e.g., deserializeAws_restJson1_1ExecuteStatement
315315
String methodName = "deserialize" + ProtocolGenerator.getSanitizedName(getName()) + symbol.getName();
316316

@@ -320,7 +320,7 @@ private void generateOperationDeserializer(GenerationContext context, OperationS
320320

321321
writer.openBlock("export function $L(\n"
322322
+ " output: $T,\n"
323-
+ " utils: DeserializerUtils\n"
323+
+ " context: SerdeContext\n"
324324
+ "): Promise<$L> {", "}", methodName, responseType, outputType, () -> {
325325
// TODO: Check status code to create appropriate error type or response type.
326326
writeHeaders(context, operation, bindingIndex);

0 commit comments

Comments
 (0)