in codegen/smithy-go-codegen/src/main/java/software/amazon/smithy/go/codegen/CodegenVisitor.java [189:291]
void execute() {
// Generate models that are connected to the service being generated.
LOGGER.fine("Walking shapes from " + service.getId() + " to find shapes to generate");
Set<Shape> serviceShapes = new TreeSet<>(new Walker(modelWithoutTraitShapes).walkShapes(service));
for (Shape shape : serviceShapes) {
shape.accept(this);
}
// Generate any required types and functions need to support protocol documents.
protocolDocumentGenerator.generateDocumentSupport();
// Generate a struct to handle unknown tags in unions
List<UnionShape> unions = serviceShapes.stream()
.map(Shape::asUnionShape)
.flatMap(OptionalUtils::stream)
.collect(Collectors.toList());
if (!unions.isEmpty()) {
writers.useShapeWriter(unions.get(0), writer -> {
UnionGenerator.generateUnknownUnion(writer, unions, symbolProvider);
});
}
for (GoIntegration integration : integrations) {
integration.writeAdditionalFiles(settings, model, symbolProvider, writers::useFileWriter);
integration.writeAdditionalFiles(settings, model, symbolProvider, writers);
integration.writeAdditionalFiles(ctx);
}
eventStreamGenerator.generateEventStreamInterfaces();
TopDownIndex.of(model).getContainedOperations(service)
.forEach(eventStreamGenerator::generateOperationEventStreamStructure);
if (protocolGenerator != null) {
LOGGER.info("Generating serde for protocol " + protocolGenerator.getProtocol() + " on " + service.getId());
ProtocolGenerator.GenerationContext.Builder contextBuilder = ProtocolGenerator.GenerationContext.builder()
.protocolName(protocolGenerator.getProtocolName())
.integrations(integrations)
.model(model)
.service(service)
.settings(settings)
.symbolProvider(symbolProvider)
.delegator(writers);
LOGGER.info("Generating serde for protocol " + protocolGenerator.getProtocol()
+ " on " + service.getId());
writers.useFileWriter("serializers.go", settings.getModuleName(), writer -> {
ProtocolGenerator.GenerationContext context = contextBuilder.writer(writer).build();
protocolGenerator.generateRequestSerializers(context);
protocolGenerator.generateSharedSerializerComponents(context);
});
writers.useFileWriter("deserializers.go", settings.getModuleName(), writer -> {
ProtocolGenerator.GenerationContext context = contextBuilder.writer(writer).build();
protocolGenerator.generateResponseDeserializers(context);
protocolGenerator.generateSharedDeserializerComponents(context);
});
if (eventStreamGenerator.hasEventStreamOperations()) {
eventStreamGenerator.writeEventStreamImplementation(writer -> {
ProtocolGenerator.GenerationContext context = contextBuilder.writer(writer).build();
protocolGenerator.generateEventStreamComponents(context);
});
}
writers.useFileWriter("endpoints.go", settings.getModuleName(), writer -> {
ProtocolGenerator.GenerationContext context = contextBuilder.writer(writer).build();
protocolGenerator.generateEndpointResolution(context);
});
writers.useFileWriter("auth.go", settings.getModuleName(), writer -> {
ProtocolGenerator.GenerationContext context = contextBuilder.writer(writer).build();
protocolGenerator.generateAuth(context);
});
writers.useFileWriter("endpoints_test.go", settings.getModuleName(), writer -> {
ProtocolGenerator.GenerationContext context = contextBuilder.writer(writer).build();
protocolGenerator.generateEndpointResolutionTests(context);
});
LOGGER.info("Generating protocol " + protocolGenerator.getProtocol()
+ " unit tests for " + service.getId());
writers.useFileWriter("protocol_test.go", settings.getModuleName(), writer -> {
protocolGenerator.generateProtocolTests(contextBuilder.writer(writer).build());
});
protocolDocumentGenerator.generateInternalDocumentTypes(protocolGenerator, contextBuilder.build());
}
LOGGER.fine("Flushing go writers");
List<SymbolDependency> dependencies = writers.getDependencies();
writers.flushWriters();
GoModuleInfo goModuleInfo = new GoModuleInfo.Builder()
.goDirective(settings.getGoDirective())
.dependencies(dependencies)
.build();
GoModGenerator.writeGoMod(settings, fileManifest, goModuleInfo);
LOGGER.fine("Generating build manifest file");
ManifestWriter.writeManifest(settings, model, fileManifest, goModuleInfo);
}