Skip to content

Commit b4454c3

Browse files
committed
feat: schema code generation
1 parent aae226d commit b4454c3

17 files changed

+1552
-205
lines changed

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

Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,16 @@
2727
import java.util.HashSet;
2828
import java.util.List;
2929
import java.util.Map;
30+
import java.util.Objects;
3031
import java.util.Optional;
3132
import java.util.Set;
3233
import java.util.TreeSet;
3334
import java.util.function.Consumer;
3435
import java.util.function.Function;
3536
import java.util.stream.Collectors;
3637
import software.amazon.smithy.build.FileManifest;
38+
import software.amazon.smithy.codegen.core.ReservedWords;
39+
import software.amazon.smithy.codegen.core.ReservedWordsBuilder;
3740
import software.amazon.smithy.codegen.core.Symbol;
3841
import software.amazon.smithy.codegen.core.SymbolProvider;
3942
import software.amazon.smithy.model.Model;
@@ -57,6 +60,7 @@
5760
import software.amazon.smithy.typescript.codegen.endpointsV2.RuleSetParameterFinder;
5861
import software.amazon.smithy.typescript.codegen.integration.ProtocolGenerator;
5962
import software.amazon.smithy.typescript.codegen.integration.RuntimeClientPlugin;
63+
import software.amazon.smithy.typescript.codegen.schema.SchemaGenerationAllowlist;
6064
import software.amazon.smithy.typescript.codegen.sections.CommandBodyExtraCodeSection;
6165
import software.amazon.smithy.typescript.codegen.sections.CommandConstructorCodeSection;
6266
import software.amazon.smithy.typescript.codegen.sections.CommandPropertiesCodeSection;
@@ -74,6 +78,7 @@
7478
final class CommandGenerator implements Runnable {
7579

7680
static final String COMMANDS_FOLDER = "commands";
81+
static final String SCHEMAS_FOLDER = "schemas";
7782

7883
private final TypeScriptSettings settings;
7984
private final Model model;
@@ -89,6 +94,9 @@ final class CommandGenerator implements Runnable {
8994
private final ProtocolGenerator protocolGenerator;
9095
private final ApplicationProtocol applicationProtocol;
9196
private final SensitiveDataFinder sensitiveDataFinder;
97+
private final ReservedWords reservedWords = new ReservedWordsBuilder()
98+
.loadWords(Objects.requireNonNull(TypeScriptClientCodegenPlugin.class.getResource("reserved-words.txt")))
99+
.build();
92100

93101
CommandGenerator(
94102
TypeScriptSettings settings,
@@ -488,7 +496,10 @@ private void generateCommandMiddlewareResolver(String configType) {
488496
);
489497
{
490498
// Add serialization and deserialization plugin.
491-
writer.write("$T(config, this.serialize, this.deserialize),", serde);
499+
if (!SchemaGenerationAllowlist.contains(service.getId())) {
500+
writer.write("$T(config, this.serialize, this.deserialize),", serde);
501+
}
502+
492503
// EndpointsV2
493504
writer.addImport(
494505
"getEndpointPlugin",
@@ -654,22 +665,37 @@ private void addCommandSpecificPlugins() {
654665
}
655666
}
656667

668+
private void writeSchemaSerde() {
669+
String operationSchema = reservedWords.escape(operation.getId().getName());
670+
writer.addRelativeImport(operationSchema, null, Paths.get(
671+
".", CodegenUtils.SOURCE_FOLDER, SCHEMAS_FOLDER, "schemas"
672+
));
673+
writer.write("""
674+
.sc($L)""",
675+
operationSchema
676+
);
677+
}
678+
657679
private void writeSerde() {
658-
writer
659-
.write(".ser($L)", getSerdeDispatcher(true))
660-
.write(".de($L)", getSerdeDispatcher(false));
680+
if (SchemaGenerationAllowlist.contains(service.getId())) {
681+
writeSchemaSerde();
682+
} else {
683+
writer
684+
.write(".ser($L)", getSerdeDispatcher(true))
685+
.write(".de($L)", getSerdeDispatcher(false));
686+
}
661687
}
662688

663689
private String getSerdeDispatcher(boolean isInput) {
664690
if (protocolGenerator == null) {
665691
return "() => { throw new Error(\"No supported protocol was found\"); }";
666692
} else {
667693
String serdeFunctionName = isInput
668-
? ProtocolGenerator.getSerFunctionShortName(symbol)
669-
: ProtocolGenerator.getDeserFunctionShortName(symbol);
694+
? ProtocolGenerator.getSerFunctionShortName(symbol)
695+
: ProtocolGenerator.getDeserFunctionShortName(symbol);
670696
writer.addRelativeImport(serdeFunctionName, null,
671-
Paths.get(".", CodegenUtils.SOURCE_FOLDER, ProtocolGenerator.PROTOCOLS_FOLDER,
672-
ProtocolGenerator.getSanitizedName(protocolGenerator.getName())));
697+
Paths.get(".", CodegenUtils.SOURCE_FOLDER, ProtocolGenerator.PROTOCOLS_FOLDER,
698+
ProtocolGenerator.getSanitizedName(protocolGenerator.getName())));
673699
return serdeFunctionName;
674700
}
675701
}

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
import software.amazon.smithy.typescript.codegen.integration.ProtocolGenerator;
5555
import software.amazon.smithy.typescript.codegen.integration.RuntimeClientPlugin;
5656
import software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration;
57+
import software.amazon.smithy.typescript.codegen.schema.SchemaGenerator;
5758
import software.amazon.smithy.typescript.codegen.validation.LongValidator;
5859
import software.amazon.smithy.typescript.codegen.validation.ReplaceLast;
5960
import software.amazon.smithy.utils.MapUtils;
@@ -111,10 +112,15 @@ public TypeScriptCodegenContext createContext(CreateContextDirective<TypeScriptS
111112
directive.model(),
112113
directive.service(),
113114
directive.settings());
115+
114116
ApplicationProtocol applicationProtocol = protocolGenerator == null
115117
? ApplicationProtocol.createDefaultHttpApplicationProtocol()
116118
: protocolGenerator.getApplicationProtocol();
117119

120+
if (null != protocolGenerator) {
121+
directive.settings().setProtocol(protocolGenerator.getProtocol());
122+
}
123+
118124
return TypeScriptCodegenContext.builder()
119125
.model(directive.model())
120126
.settings(directive.settings())
@@ -281,6 +287,8 @@ private void generateClient(GenerateServiceDirective<TypeScriptCodegenContext, T
281287
}
282288
}
283289

290+
new SchemaGenerator(model, fileManifest, settings, symbolProvider).run();
291+
284292
if (containedOperations.stream().anyMatch(operation -> operation.hasTrait(PaginatedTrait.ID))) {
285293
PaginationGenerator.writeIndex(model, service, fileManifest);
286294
delegator.useFileWriter(PaginationGenerator.PAGINATION_INTERFACE_FILE, paginationWriter ->

0 commit comments

Comments
 (0)