private static JObject VisitRuntimeToken()

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