in packages/extensions/openapi-to-typespec/src/transforms/transform-arm-resources.ts [318:414]
function convertResourceCreateOrReplaceOperation(
resourceMetadata: ArmResource,
operations: Record<string, Operation>,
): TspArmResourceOperation[] {
if (resourceMetadata.CreateOperation) {
const operation = resourceMetadata.CreateOperation;
const swaggerOperation = operations[operation.OperationID];
const isLongRunning = swaggerOperation.extensions?.["x-ms-long-running-operation"] ?? false;
const armOperation = buildNewArmOperation(
resourceMetadata,
operation,
swaggerOperation,
isLongRunning ? "ArmResourceCreateOrReplaceAsync" : "ArmResourceCreateOrReplaceSync",
);
const bodyParam = swaggerOperation.requests?.[0].parameters?.find((p) => p.protocol.http?.in === "body");
if (!bodyParam) {
armOperation.fixMe = [
"// FIXME: (ArmResourceCreateOrReplace): ArmResourceCreateOrReplaceAsync/ArmResourceCreateOrReplaceSync should have a body parameter.",
];
}
const finalStateVia =
swaggerOperation.extensions?.["x-ms-long-running-operation-options"]?.["final-state-via"] ?? "location";
armOperation.lroHeaders = isLongRunning && finalStateVia === "location" ? "Location" : undefined;
buildBodyDecorator(bodyParam, armOperation, resourceMetadata, "resource", "Resource create parameters.");
const asyncNames: NamesOfResponseTemplate = {
_200Name: "ArmResourceUpdatedResponse",
_200NameNoBody: "OkResponse",
_201Name: "ArmResourceCreatedResponse",
_201NameNoBody: "CreatedResponse",
_202Name: "ArmAcceptedLroResponse",
_202NameNoBody: "ArmAcceptedLroResponse",
_204Name: "ArmNoContentResponse",
};
const syncNames: NamesOfResponseTemplate = {
_200Name: "ArmResourceUpdatedResponse",
_200NameNoBody: "OkResponse",
_201Name: "ArmResourceCreatedSyncResponse",
_201NameNoBody: "CreatedResponse",
_202Name: "AcceptedResponse",
_202NameNoBody: "AcceptedResponse",
_204Name: "ArmNoContentResponse",
};
let responses: TypespecTemplateModel[] = isLongRunning
? getTemplateResponses(swaggerOperation, asyncNames)
: getTemplateResponses(swaggerOperation, syncNames);
const templateAsyncResponses: TypespecTemplateModel[] = [
{
kind: "template",
name: asyncNames._200Name,
arguments: [{ kind: "object", name: resourceMetadata.SwaggerModelName }],
},
{
kind: "template",
name: asyncNames._201Name,
arguments: [{ kind: "object", name: resourceMetadata.SwaggerModelName }],
},
];
const templateSyncResponses: TypespecTemplateModel[] = [
{
kind: "template",
name: syncNames._200Name,
arguments: [{ kind: "object", name: resourceMetadata.SwaggerModelName }],
},
{
kind: "template",
name: syncNames._201Name,
arguments: [{ kind: "object", name: resourceMetadata.SwaggerModelName }],
},
];
if (isLongRunning && isSameResponses(responses, templateAsyncResponses)) responses = [];
if (!isLongRunning && isSameResponses(responses, templateSyncResponses)) responses = [];
if (responses.length > 0) armOperation.response = responses;
if (armOperation.lroHeaders && responses) {
let _201Response = responses.find((r) => r.name === asyncNames._201Name);
if (_201Response) {
_201Response.arguments!.push({
kind: "object",
name: "ArmLroLocationHeader & Azure.Core.Foundations.RetryAfterHeader",
}); //TO-DO: do it in a better way
armOperation.lroHeaders = undefined;
}
_201Response = responses.find((r) => r.name === syncNames._201NameNoBody);
if (_201Response) {
_201Response.additionalTemplateModel = "ArmLroLocationHeader & Azure.Core.Foundations.RetryAfterHeader";
}
}
buildSuppressionsForArmOperation(armOperation, asyncNames, syncNames);
return [armOperation as TspArmResourceLifeCycleOperation];
}
return [];
}