in packages/extensions/openapi-to-typespec/src/transforms/transform-arm-resources.ts [687:777]
function convertResourceActionOperations(
resourceMetadata: ArmResource,
operations: Record<string, Operation>,
): TspArmResourceActionOperation[] {
const converted: TspArmResourceActionOperation[] = [];
if (resourceMetadata.OtherOperations.length) {
for (const operation of resourceMetadata.OtherOperations) {
const swaggerOperation = operations[operation.OperationID];
const isLongRunning = swaggerOperation.extensions?.["x-ms-long-running-operation"] ?? false;
const armOperation = buildNewArmOperation(
resourceMetadata,
operation,
swaggerOperation,
isLongRunning ? "ArmResourceActionAsync" : "ArmResourceActionSync",
);
const finalStateVia =
swaggerOperation.extensions?.["x-ms-long-running-operation-options"]?.["final-state-via"] ?? "location";
armOperation.lroHeaders =
isLongRunning && finalStateVia === "azure-async-operation" ? "Azure-AsyncOperation" : undefined;
buildRequestForAction(
armOperation,
swaggerOperation,
resourceMetadata,
true,
"body",
"The content of the action request",
);
armOperation.decorators = armOperation.decorators ?? [];
if (operation.Method !== "POST") {
armOperation.decorators.push({ name: operation.Method.toLocaleLowerCase() });
}
const segments = operation.Path.split("/");
if (segments[segments.length - 1] !== armOperation.name) {
armOperation.decorators.push({ name: "action", arguments: [segments[segments.length - 1]] });
}
const asyncNames: NamesOfResponseTemplate = {
_200Name: "ArmResponse",
_200NameNoBody: "OkResponse",
_201Name: "ArmResourceCreatedResponse",
_201NameNoBody: "CreatedResponse",
_202Name: "ArmAcceptedLroResponse",
_202NameNoBody: "ArmAcceptedLroResponse",
_204Name: "NoContentResponse",
};
const syncNames: NamesOfResponseTemplate = {
_200Name: "ArmResponse",
_200NameNoBody: "OkResponse",
_201Name: "ArmResourceCreatedSyncResponse",
_201NameNoBody: "CreatedResponse",
_202Name: "AcceptedResponse",
_202NameNoBody: "AcceptedResponse",
_204Name: "NoContentResponse",
};
let responses: TypespecTemplateModel[] | TypespecVoidType = isLongRunning
? getTemplateResponses(swaggerOperation, asyncNames)
: getTemplateResponses(swaggerOperation, syncNames);
if (isLongRunning) {
const _202NoBodyResponseIndex = responses.findIndex(
(r) => r.name === asyncNames._202NameNoBody && !r.arguments,
);
if (_202NoBodyResponseIndex >= 0 && responses.length > 1) {
responses.splice(_202NoBodyResponseIndex, 1);
} else {
armOperation.kind = "ArmResourceActionAsyncBase";
armOperation.baseParameters = armOperation.baseParameters ?? [
`${getFullyQualifiedName("DefaultBaseParameters")}<${armOperation.resource}>`,
];
const _202Response = responses.find((r) => r.name === asyncNames._202Name);
if (_202Response && armOperation.lroHeaders === "Azure-AsyncOperation") {
_202Response.arguments!.push({
kind: "object",
name: "ArmAsyncOperationHeader & Azure.Core.Foundations.RetryAfterHeader",
});
}
}
}
if (responses.length === 0) responses = { kind: "void", name: "_" };
armOperation.response = responses;
converted.push(armOperation as TspArmResourceActionOperation);
}
}
return converted;
}