in packages/autorest.go/src/generator/generator.ts [26:224]
export async function generateCode(host: AutorestExtensionHost) {
const debug = await host.getValue('debug') || false;
try {
// get the code model from the core
const session = await startSession<go.CodeModel>(host);
const operations = await generateOperations(session.model);
let filePrefix = await session.getValue('file-prefix', '');
// if a file prefix was specified, ensure it's properly snaked
if (filePrefix.length > 0 && filePrefix[filePrefix.length - 1] !== '_') {
filePrefix += '_';
}
// output the model to the pipeline. this must happen after all model
// updates are complete and before any source files are written.
host.writeFile({
filename: 'code-model-v4.yaml',
content: serialize(session.model),
artifactType: 'code-model-v4'
});
for (const op of values(operations)) {
let fileName = op.name.toLowerCase();
// op.name is the client name, e.g. FooClient.
// insert a _ before Client, i.e. Foo_Client
// if the name isn't simply Client.
if (fileName !== 'client') {
fileName = fileName.substring(0, fileName.length-6) + '_client';
}
host.writeFile({
filename: `${filePrefix}${fileName}.go`,
content: op.content,
artifactType: 'source-file-go'
});
}
const factoryGatherAllParams = await session.getValue('factory-gather-all-params', true);
session.model.options.factoryGatherAllParams = factoryGatherAllParams;
const clientFactory = await generateClientFactory(session.model);
if (clientFactory.length > 0) {
host.writeFile({
filename: `${filePrefix}client_factory.go`,
content: clientFactory,
artifactType: 'source-file-go'
});
}
const constants = await generateConstants(session.model);
host.writeFile({
filename: `${filePrefix}constants.go`,
content: constants,
artifactType: 'source-file-go'
});
const models = await generateModels(session.model);
host.writeFile({
filename: `${filePrefix}models.go`,
content: models.models,
artifactType: 'source-file-go'
});
if (models.serDe.length > 0) {
host.writeFile({
filename: `${filePrefix}models_serde.go`,
content: models.serDe,
artifactType: 'source-file-go'
});
}
const options = await generateOptions(session.model);
if (options.length > 0) {
host.writeFile({
filename: `${filePrefix}options.go`,
content: options,
artifactType: 'source-file-go'
});
}
const interfaces = await generateInterfaces(session.model);
if (interfaces.length > 0) {
host.writeFile({
filename: `${filePrefix}interfaces.go`,
content: interfaces,
artifactType: 'source-file-go'
});
}
const responses = await generateResponses(session.model);
if (responses.responses.length > 0) {
host.writeFile({
filename: `${filePrefix}responses.go`,
content: responses.responses,
artifactType: 'source-file-go'
});
}
if (responses.serDe.length > 0) {
host.writeFile({
filename: `${filePrefix}responses_serde.go`,
content: responses.serDe,
artifactType: 'source-file-go'
});
}
const timeHelpers = await generateTimeHelpers(session.model);
for (const helper of values(timeHelpers)) {
host.writeFile({
filename: `${filePrefix}${helper.name.toLowerCase()}.go`,
content: helper.content,
artifactType: 'source-file-go'
});
}
const polymorphics = await generatePolymorphicHelpers(session.model);
if (polymorphics.length > 0) {
host.writeFile({
filename: `${filePrefix}polymorphic_helpers.go`,
content: polymorphics,
artifactType: 'source-file-go'
});
}
// don't overwrite an existing go.mod file, update it if required
const existingGoMod = await host.readFile('go.mod');
// per coding guidelines, undefined is preferred to null
const gomod = await generateGoModFile(session.model, existingGoMod !== null ? existingGoMod : undefined);
if (gomod.length > 0) {
host.writeFile({
filename: 'go.mod',
content: gomod,
artifactType: 'source-file-go'
});
}
const xmlAddlProps = await generateXMLAdditionalPropsHelpers(session.model);
if (xmlAddlProps.length > 0) {
host.writeFile({
filename: `${filePrefix}xml_helper.go`,
content: xmlAddlProps,
artifactType: 'source-file-go'
});
}
if (session.model.options.generateFakes) {
const serverContent = await generateServers(session.model);
for (const op of values(serverContent.servers)) {
let fileName = op.name.toLowerCase();
// op.name is the server name, e.g. FooServer.
// insert a _ before Server, i.e. Foo_Server
// if the name isn't simply Server.
if (fileName !== 'server') {
fileName = fileName.substring(0, fileName.length-6) + '_server';
}
host.writeFile({
filename: `fake/${filePrefix}${fileName}.go`,
content: op.content,
artifactType: 'source-file-go'
});
}
const serverFactory = generateServerFactory(session.model);
if (serverFactory !== '') {
host.writeFile({
filename: `fake/${filePrefix}server_factory.go`,
content: serverFactory,
artifactType: 'source-file-go'
});
}
host.writeFile({
filename: `fake/${filePrefix}internal.go`,
content: serverContent.internals,
artifactType: 'source-file-go'
});
const timeHelpers = await generateTimeHelpers(session.model, 'fake');
for (const helper of values(timeHelpers)) {
host.writeFile({
filename: `fake/${filePrefix}${helper.name.toLowerCase()}.go`,
content: helper.content,
artifactType: 'source-file-go'
});
}
const polymorphics = await generatePolymorphicHelpers(session.model, 'fake');
if (polymorphics.length > 0) {
host.writeFile({
filename: `fake/${filePrefix}polymorphic_helpers.go`,
content: polymorphics,
artifactType: 'source-file-go'
});
}
}
} catch (E) {
if (debug) {
console.error(`${fileURLToPath(import.meta.url)} - FAILURE ${JSON.stringify(E)} ${(<Error>E).stack}`);
}
throw E;
}
}