internal static object PickZones()

in src/PSRule.Rules.Azure/Data/Template/Functions.cs [971:1010]


    internal static object PickZones(ITemplateContext context, object[] args)
    {
        var argCount = CountArgs(args);
        if (argCount is < 3 or > 5)
            throw ArgumentsOutOfRange(nameof(PickZones), args);

        if (!ExpressionHelpers.TryString(args[0], out var providerNamespace))
            throw ArgumentInvalidString(nameof(PickZones), PROPERTY_PROVIDER_NAMESPACE);

        if (!ExpressionHelpers.TryString(args[1], out var resourceType))
            throw ArgumentInvalidString(nameof(PickZones), PROPERTY_RESOURCE_TYPE);

        if (!ExpressionHelpers.TryString(args[2], out var location))
            throw ArgumentInvalidString(nameof(PickZones), PROPERTY_LOCATION);

        var numberOfZones = 1;
        if (argCount > 3 && !ExpressionHelpers.TryInt(args[3], out numberOfZones))
            throw ArgumentInvalidInteger(nameof(PickZones), PROPERTY_NUMBER_OF_ZONES);

        var offset = 0;
        if (argCount > 4 && !ExpressionHelpers.TryInt(args[4], out offset))
            throw ArgumentInvalidInteger(nameof(PickZones), PROPERTY_OFFSET);

        var resourceTypes = context.GetResourceType(providerNamespace, resourceType);
        if (resourceTypes == null || resourceTypes.Length == 0)
            throw ArgumentInvalidResourceType(nameof(PickZones), providerNamespace, resourceType);

        if (resourceTypes[0].ZoneMappings == null || resourceTypes[0].ZoneMappings.Length == 0)
            return new JArray();

        var mapping = resourceTypes[0].ZoneMappings.Where(z => LocationHelper.Equal(location, z.Location)).FirstOrDefault();
        if (mapping == null || mapping.Zones == null || mapping.Zones.Length == 0)
            return new JArray();

        if (mapping.Zones.Length < numberOfZones + offset)
            throw ArgumentsOutOfRange(nameof(PickZones), args);

        var zones = mapping.Zones.Skip(offset).Take(numberOfZones).ToArray();
        return new JArray(zones);
    }