private static ResourceValue ResourceInstance()

in src/PSRule.Rules.Azure/Data/Template/TemplateVisitor.cs [1293:1342]


    private static ResourceValue ResourceInstance(TemplateContext context, JObject resource, CopyIndexState copyIndex, string symbolicName)
    {
        if (resource.TryGetProperty<JValue>(PROPERTY_NAME, out var nameValue))
            resource[PROPERTY_NAME] = ResolveToken(context, nameValue);

        if (resource.TryGetProperty<JArray>(PROPERTY_DEPENDS_ON, out var dependsOn))
            resource[PROPERTY_DEPENDS_ON] = ExpandArray(context, dependsOn);

        resource.TryNameProperty(out var name);
        resource.TryTypeProperty(out var type);

        var deploymentScope = GetDeploymentScope(context, resource, type, out var managementGroup, out var subscriptionId, out var resourceGroupName);

        // Get scope if specified.
        var scope = context.TryParentResourceId(resource, out var parentIds) && parentIds != null && parentIds.Length > 0 ? parentIds[0] : null;

        string resourceId = null;

        // Handle special case when resource type is a resource group.
        if (StringComparer.OrdinalIgnoreCase.Equals(type, TYPE_RESOURCE_GROUPS))
        {
            resourceId = ResourceHelper.ResourceGroupId(subscriptionId: subscriptionId, resourceGroup: name);
        }
        else if (deploymentScope == DeploymentScope.ResourceGroup)
        {
            resourceId = ResourceHelper.ResourceId(tenant: null, managementGroup: null, subscriptionId: subscriptionId, resourceGroup: resourceGroupName, resourceType: type, resourceName: name, scopeId: scope);
        }
        else if (deploymentScope == DeploymentScope.Subscription)
        {
            resourceId = ResourceHelper.ResourceId(tenant: null, managementGroup: null, subscriptionId: subscriptionId, resourceGroup: null, resourceType: type, resourceName: name, scopeId: null);
        }
        else if (deploymentScope == DeploymentScope.ManagementGroup)
        {
            resourceId = ResourceHelper.ResourceId(tenant: null, managementGroup: managementGroup, subscriptionId: null, resourceGroup: null, resourceType: type, resourceName: name, scopeId: scope);
        }
        else if (deploymentScope == DeploymentScope.Tenant)
        {
            resourceId = ResourceHelper.ResourceId(tenant: "/", managementGroup: null, subscriptionId: null, resourceGroup: null, resourceType: type, resourceName: name, scopeId: "/");
        }

        _ = context.UpdateResourceScope(resource);
        resource[PROPERTY_ID] = resourceId;
        var result = new ResourceValue(resourceId, name, type, symbolicName, resource, copyIndex.Clone());

        // Map dependencies if any are defined.
        resource.TryGetDependencies(out var dependencies);
        context.TrackDependencies(result, dependencies);

        return result;
    }