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