@autorest/go
Version:
AutoRest Go Generator
215 lines • 10.7 kB
JavaScript
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
import { serialize } from '@azure-tools/codegen';
import { startSession } from '@autorest/extension-base';
import { values } from '@azure-tools/linq';
import { generateClientFactory } from '../../../codegen.go/src/clientFactory.js';
import { generateOperations } from '../../../codegen.go/src/operations.js';
import { generateModels } from '../../../codegen.go/src/models.js';
import { generateOptions } from '../../../codegen.go/src/options.js';
import { generateInterfaces } from '../../../codegen.go/src/interfaces.js';
import { generateResponses } from '../../../codegen.go/src/responses.js';
import { generateConstants } from '../../../codegen.go/src/constants.js';
import { generateTimeHelpers } from '../../../codegen.go/src/time.js';
import { generatePolymorphicHelpers } from '../../../codegen.go/src/polymorphics.js';
import { generateGoModFile } from '../../../codegen.go/src/gomod.js';
import { generateXMLAdditionalPropsHelpers } from '../../../codegen.go/src/xmlAdditionalProps.js';
import { generateServers } from '../../../codegen.go/src/fake/servers.js';
import { generateServerFactory } from '../../../codegen.go/src/fake/factory.js';
import { fileURLToPath } from 'url';
// The generator emits Go source code files to disk.
export function generateCode(host) {
return __awaiter(this, void 0, void 0, function* () {
const debug = (yield host.getValue('debug')) || false;
try {
// get the code model from the core
const session = yield startSession(host);
const operations = yield generateOperations(session.model);
let filePrefix = yield 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 = yield session.getValue('factory-gather-all-params', true);
session.model.options.factoryGatherAllParams = factoryGatherAllParams;
const clientFactory = yield generateClientFactory(session.model);
if (clientFactory.length > 0) {
host.writeFile({
filename: `${filePrefix}client_factory.go`,
content: clientFactory,
artifactType: 'source-file-go'
});
}
const constants = yield generateConstants(session.model);
host.writeFile({
filename: `${filePrefix}constants.go`,
content: constants,
artifactType: 'source-file-go'
});
const models = yield 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 = yield generateOptions(session.model);
if (options.length > 0) {
host.writeFile({
filename: `${filePrefix}options.go`,
content: options,
artifactType: 'source-file-go'
});
}
const interfaces = yield generateInterfaces(session.model);
if (interfaces.length > 0) {
host.writeFile({
filename: `${filePrefix}interfaces.go`,
content: interfaces,
artifactType: 'source-file-go'
});
}
const responses = yield 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 = yield 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 = yield 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 = yield host.readFile('go.mod');
// per coding guidelines, undefined is preferred to null
const gomod = yield generateGoModFile(session.model, existingGoMod !== null ? existingGoMod : undefined);
if (gomod.length > 0) {
host.writeFile({
filename: 'go.mod',
content: gomod,
artifactType: 'source-file-go'
});
}
const xmlAddlProps = yield 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 = yield 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 = yield 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 = yield 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)} ${E.stack}`);
}
throw E;
}
});
}
//# sourceMappingURL=generator.js.map