in src/PSRule.Rules.Azure/Data/Policy/PolicyAssignmentVisitor.cs [1512:1613]
private static JObject VisitRuntimeToken(PolicyAssignmentContext context, TokenStream tokens)
{
if (tokens.ConsumeFunction(PROPERTY_PADLEFT) && tokens.Skip(ExpressionTokenType.GroupStart))
{
var child = VisitRuntimeToken(context, tokens);
var o = new JObject
{
{ PROPERTY_PADLEFT, child },
};
if (tokens.ConsumeInteger(out var totalLength))
o.Add("totalLength", totalLength);
if (tokens.ConsumeString(out var paddingCharacter))
o.Add("paddingCharacter", paddingCharacter);
tokens.Skip(ExpressionTokenType.GroupEnd);
return o;
}
else if (tokens.ConsumeFunction(FUNCTION_CURRENT) && tokens.Skip(ExpressionTokenType.GroupStart))
{
var fieldTarget = string.Empty;
if (tokens.TryTokenType(ExpressionTokenType.String, out var current))
{
fieldTarget = current.Content;
if (context.TryPolicyAliasPath(current.Content, out var policyAlias))
fieldTarget = TrimFieldName(context, policyAlias);
}
var o = new JObject
{
{ PROPERTY_PATH, fieldTarget },
};
tokens.Skip(ExpressionTokenType.GroupEnd);
return o;
}
else if (tokens.ConsumeFunction(PROPERTY_CONCAT) &&
tokens.TryTokenType(ExpressionTokenType.GroupStart, out _))
{
var items = new JArray();
while (tokens.Current.Type == ExpressionTokenType.Element ||
tokens.Current.Type == ExpressionTokenType.String)
{
var child = VisitRuntimeToken(context, tokens);
items.Add(child);
}
var o = new JObject
{
[PROPERTY_CONCAT] = items
};
tokens.TryTokenType(ExpressionTokenType.GroupEnd, out _);
return o;
}
else if (tokens.ConsumeFunction(PROPERTY_SPLIT) &&
tokens.TryTokenType(ExpressionTokenType.GroupStart, out _))
{
var child = VisitRuntimeToken(context, tokens);
var delimiter = new JArray();
if (tokens.ConsumeString(out var d))
{
delimiter.Add(d);
}
var o = new JObject
{
{ PROPERTY_SPLIT, child },
{ PROPERTY_DELIMITER, delimiter }
};
tokens.TryTokenType(ExpressionTokenType.GroupEnd, out _);
return o;
}
else if (tokens.ConsumeFunction(PROPERTY_FIELD) &&
tokens.TryTokenType(ExpressionTokenType.GroupStart, out _) &&
tokens.ConsumeString(out var field))
{
field = context.TryPolicyAliasPath(field, out var aliasPath) ? TrimFieldName(context, aliasPath) : field;
var o = new JObject
{
{ PROPERTY_PATH, field }
};
tokens.TryTokenType(ExpressionTokenType.GroupEnd, out _);
return o;
}
else if (tokens.ConsumeString(out var s))
{
var o = new JObject
{
{ PROPERTY_STRING, s }
};
return o;
}
else if (tokens.ConsumeInteger(out var i))
{
var o = new JObject
{
{ PROPERTY_INTEGER, i }
};
return o;
}
return null;
}