function convertResourceActionOperations()

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