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");
}