export function generateOperation()

in packages/extensions/openapi-to-typespec/src/generate/generate-operations.ts [15:75]


export function generateOperation(operation: TypespecOperation, operationGroup?: TypespecOperationGroup) {
  const { isArm } = getOptions();
  const doc = generateDocs(operation);
  const summary = generateSummary(operation);
  const { verb, name, route, parameters } = operation;
  const params = generateParameters(parameters);
  const statements: string[] = [];
  summary && statements.push(summary);
  statements.push(doc);
  const modelResponses = [...new Set(operation.responses.filter((r) => r[1] !== "void").map((r) => r[1]))];
  generateMultiResponseWarning(modelResponses, statements);

  for (const fixme of operation.fixMe ?? []) {
    statements.push(fixme);
  }

  if (operation.decorators) {
    statements.push(generateDecorators(operation.decorators));
  }
  if (isArm) {
    statements.push(`@route("${route}")`);
    const otherResponses = operation.responses
      .filter((r) => r[1] === "void" && ["200", "202"].includes(r[0]))
      .map((r) => {
        if (r[0] === "200") return "OkResponse";
        if (r[0] === "202") return "ArmAcceptedResponse";
      });
    statements.push(
      `@${verb} op \`${name}\`(
        ...ApiVersionParameter,
        ${params}
        ): ${modelResponses.length > 0 ? `ArmResponse<${modelResponses.join(" | ")}>` : ""}${
          otherResponses.length > 0 ? `| ${otherResponses.join("|")}` : ""
        } | ErrorResponse;\n\n\n`,
    );
  } else if (!operation.resource) {
    const names = [name, ...modelResponses, ...parameters.map((p) => p.name)];
    const duplicateNames = findDuplicates(names);
    generateNameCollisionWarning(duplicateNames, statements);
    statements.push(`@route("${route}")`);
    statements.push(
      `@${verb} op \`${name}\` is Azure.Core.Foundations.Operation<${params ? params : "{}"}, ${
        modelResponses.length > 0 ? `${modelResponses.join(" | ")}` : "void"
      }>;\n\n\n`,
    );
  } else {
    const { resource } = operation;
    const names = [name, ...modelResponses, ...parameters.map((p) => p.name)];
    const duplicateNames = findDuplicates(names);
    generateNameCollisionWarning(duplicateNames, statements);
    const resourceParameters = generateParameters(
      parameters.filter((param) => !["path", "body"].some((p) => p === param.location)),
    );
    const parametersString = resourceParameters ? `, { parameters: ${resourceParameters}}` : "";
    statements.push(
      `${operationGroup?.name ? "" : "op "}`,
      `\`${name}\` is Azure.Core.${resource.kind}<${resource.response.name} ${parametersString}>;\n\n\n`,
    );
  }
  return statements.join("\n");
}