async function generate()

in packages/typespec-go/src/emitter.ts [83:219]


async function generate(context: EmitContext<GoEmitterOptions>) {
  const codeModel = await tcgcToGoCodeModel(context);
  await mkdir(context.emitterOutputDir, {recursive: true});

  // don't overwrite an existing go.mod file, update it if required
  const goModFile = `${context.emitterOutputDir}/go.mod`;
  let existingGoMod: string | undefined;
  if (existsSync(goModFile)) {
    existingGoMod = (await readFile(goModFile)).toString();
  }
  const gomod = await generateGoModFile(codeModel, existingGoMod);
  if (gomod.length > 0) {
    await writeFile(goModFile, gomod);
  }

  let filePrefix = '';
  if (context.options['file-prefix']) {
    filePrefix = context.options['file-prefix'];
    // if a file prefix was specified, ensure it's properly snaked
    if (filePrefix[filePrefix.length - 1] !== '_') {
      filePrefix += '_';
    }
  }
  const clientFactory = await generateClientFactory(codeModel);
  if (clientFactory.length > 0) {
    await writeFile(`${context.emitterOutputDir}/${filePrefix}client_factory.go`, clientFactory);
  }

  const constants = await generateConstants(codeModel);
  if (constants.length > 0) {
    await writeFile(`${context.emitterOutputDir}/${filePrefix}constants.go`, constants);
  }

  const interfaces = await generateInterfaces(codeModel);
  if (interfaces.length > 0) {
    await writeFile(`${context.emitterOutputDir}/${filePrefix}interfaces.go`, interfaces);
  }

  const models = await generateModels(codeModel);
  if (models.models.length > 0) {
    await writeFile(`${context.emitterOutputDir}/${filePrefix}models.go`, models.models);
  }
  if (models.serDe.length > 0) {
    await writeFile(`${context.emitterOutputDir}/${filePrefix}models_serde.go`, models.serDe);
  }

  const operations = await generateOperations(codeModel);
  for (const op of 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';
    }
    await writeFile(`${context.emitterOutputDir}/${filePrefix}${fileName}.go`, op.content);
  }

  if (codeModel.options.generateExamples) {
    const examples = await generateExamples(codeModel);
    for (const example of examples) {
      let fileName = example.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.
      // and insert _example_test at the end.
      if (fileName !== 'client') {
        fileName = fileName.substring(0, fileName.length - 6) + '_client';
      }
      fileName += '_example_test';
      await writeFile(`${context.emitterOutputDir}/${filePrefix}${fileName}.go`, example.content);
    }
  }

  const options = await generateOptions(codeModel);
  if (options.length > 0) {
    await writeFile(`${context.emitterOutputDir}/${filePrefix}options.go`, options);
  }

  const polymorphics = await generatePolymorphicHelpers(codeModel);
  if (polymorphics.length > 0) {
    await writeFile(`${context.emitterOutputDir}/${filePrefix}polymorphic_helpers.go`, polymorphics);
  }

  const responses = await generateResponses(codeModel);
  if (responses.responses.length > 0) {
    await writeFile(`${context.emitterOutputDir}/${filePrefix}responses.go`, responses.responses);
  }
  if (responses.serDe.length > 0) {
    await writeFile(`${context.emitterOutputDir}/${filePrefix}responses_serde.go`, responses.serDe);
  }

  const timeHelpers = await generateTimeHelpers(codeModel);
  for (const helper of timeHelpers) {
    await writeFile(`${context.emitterOutputDir}/${filePrefix}${helper.name.toLowerCase()}.go`, helper.content);
  }

  const xmlAddlProps = await generateXMLAdditionalPropsHelpers(codeModel);
  if (xmlAddlProps.length > 0) {
    await writeFile(`${context.emitterOutputDir}/${filePrefix}xml_helper.go`, xmlAddlProps);
  }

  if (codeModel.options.generateFakes) {
    const serverContent = await generateServers(codeModel);
    if (serverContent.servers.length > 0) {
      const fakesDir = context.emitterOutputDir + '/fake';
      await mkdir(fakesDir, {recursive: true});
      for (const op of 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';
        }
        await writeFile(`${fakesDir}/${filePrefix}${fileName}.go`, op.content);
      }

      const serverFactory = generateServerFactory(codeModel);
      if (serverFactory.length > 0) {
        await writeFile(`${fakesDir}/${filePrefix}server_factory.go`, serverFactory);
      }

      await writeFile(`${fakesDir}/${filePrefix}internal.go`, serverContent.internals);

      const timeHelpers = await generateTimeHelpers(codeModel, 'fake');
      for (const helper of timeHelpers) {
        await writeFile(`${fakesDir}/${filePrefix}${helper.name.toLowerCase()}.go`, helper.content);
      }

      const polymorphics = await generatePolymorphicHelpers(codeModel, 'fake');
      if (polymorphics.length > 0) {
        await writeFile(`${fakesDir}/${filePrefix}polymorphic_helpers.go`, polymorphics);
      }
    }
  }
}