function buildResource()

in packages/extensions/openapi-to-typespec/src/resource/parse-metadata.ts [147:223]


function buildResource(
  resourceSchemaName: string,
  set: OperationSet,
  operationSets: OperationSet[],
  codeModel: CodeModel,
): ArmResource {
  const getOperation = buildLifeCycleOperation(set, HttpMethod.Get, "Get");
  if (getOperation === undefined) {
    logger().error(`Resource ${resourceSchemaName} must have a GET operation.`);
  }
  const createOperation = buildLifeCycleOperation(set, HttpMethod.Put, "CreateOrUpdate");
  const updateOperation =
    buildLifeCycleOperation(set, HttpMethod.Patch, "Update") ?? buildLifeCycleOperation(set, HttpMethod.Put, "Update");
  const deleteOperation = buildLifeCycleOperation(set, HttpMethod.Delete, "Delete");
  const existOperation = buildLifeCycleOperation(set, HttpMethod.Head, "CheckExistence");
  const listOperation = buildListOperation(set);
  const otherOperation = buildOtherOperation(set);

  const resourceSchema = codeModel.schemas.objects?.find((o) => o.language.default.name === resourceSchemaName);
  if (!resourceSchema) {
    logger().error(`Cannot find resource schema for name ${resourceSchemaName}`);
  }

  const parents = getParents(set.RequestPath, operationSets);
  const isTenantResource = parents.length > 0 && parents[0] === "TenantResource";
  const isSubscriptionResource = parents.length > 0 && parents[0] === "SubscriptionResource";
  const isManagementGroupResource = parents.length > 0 && parents[0] === "ManagementGroupResource";

  const operationsFromResourceGroupExtension = [];
  const operationsFromSubscriptionExtension = [];
  const operationsFromManagementGroupExtension = [];
  const operationsFromTenantExtension = [];

  for (const extension of getExtensionOperation(set)) {
    const extensionOperation = buildResourceOperationFromOperation(extension[0], "_");
    switch (extension[1]) {
      case "ResourceGroup":
        operationsFromResourceGroupExtension.push(extensionOperation);
        break;
      case "Subscription":
        operationsFromSubscriptionExtension.push(extensionOperation);
        break;
      case "ManagementGroup":
        operationsFromManagementGroupExtension.push(extensionOperation);
        break;
      case "Tenant":
        operationsFromTenantExtension.push(extensionOperation);
        break;
    }
  }

  return {
    Name: lastWordToSingular(resourceSchemaName),
    GetOperation: getOperation,
    ExistOperation: existOperation,
    CreateOperation: createOperation,
    UpdateOperation: updateOperation,
    DeleteOperation: deleteOperation,
    ListOperations: listOperation ?? [],
    OperationsFromResourceGroupExtension: operationsFromResourceGroupExtension,
    OperationsFromSubscriptionExtension: operationsFromSubscriptionExtension,
    OperationsFromManagementGroupExtension: operationsFromManagementGroupExtension,
    OperationsFromTenantExtension: operationsFromTenantExtension,
    OtherOperations: otherOperation,
    Parents: parents,
    SwaggerModelName: resourceSchemaName,
    ResourceType: getResourceType(set.RequestPath),
    ResourceKey: getResourceKey(set.RequestPath),
    ResourceKeySegment: getResourceKeySegment(set.RequestPath),
    IsTrackedResource: isTrackedResource(resourceSchema!),
    IsTenantResource: isTenantResource,
    IsSubscriptionResource: isSubscriptionResource,
    IsManagementGroupResource: isManagementGroupResource,
    IsExtensionResource: isScopedPath(set.RequestPath),
    IsSingletonResource: isSingleton(set),
  };
}