in src/PSRule/Definitions/Expressions/LanguageExpressions.cs [610:633]
internal static bool Subset(ExpressionContext context, ExpressionInfo info, object[] args, object o)
{
var properties = GetProperties(args);
if (TryPropertyArray(properties, SUBSET, out var expectedValue) && TryField(properties, out var field) &&
GetCaseSensitive(properties, out var caseSensitive) && GetUnique(properties, out var unique))
{
context.ExpressionTrace(SUBSET, field, expectedValue);
if (!ObjectHelper.GetPath(context, o, field, caseSensitive: false, out object actualValue))
return NotHasField(context, field);
if (!ExpressionHelpers.TryEnumerableLength(actualValue, out _))
return Fail(context, ReasonStrings.NotEnumerable, field);
for (var i = 0; expectedValue != null && i < expectedValue.Length; i++)
{
if (!ExpressionHelpers.CountValue(actualValue, expectedValue.GetValue(i), caseSensitive, out var count) || (count > 1 && unique))
return count == 0
? Fail(context, ReasonStrings.Subset, field, expectedValue.GetValue(i))
: Fail(context, ReasonStrings.SubsetDuplicate, field, expectedValue.GetValue(i));
}
return Pass();
}
return Invalid(context, SUBSET);
}