Esempio n. 1
0
        private static IEnumerable <object> FindAllOnPath(FilterState pkg)
        {
            if (pkg.Data == null || pkg.SourcePath == null || pkg.SourcePath.Length < 1)
            {
                yield break;
            }

            var root     = pkg.SourcePath[0];
            var data     = pkg.Data;
            var pathSkip = 1;

            if (root == "#")
            {
                if (pkg.SourcePath.Length < 2)
                {
                    yield break;
                }
                var newFilter = pkg.RedirectFilter(pkg.SourcePath[1]);
                if (newFilter == null)
                {
                    yield break;
                }
                data = ApplyFilterRecursive(newFilter);
                if (data == null)
                {
                    yield break;
                }
                pathSkip = 2; // root and filter name
            }
            else if (root == "D")
            {
                if (pkg.SourcePath.Length < 1)
                {
                    yield break;
                }
                data = pkg.RepeaterData;
                if (data == null)
                {
                    throw new Exception("Found a repeater filter on a page with no repeater data");
                }
                pathSkip = 1; // root
            }
            else if (root != "")
            {
                throw new Exception($"Unexpected root marker: {root}");
            }

            // Walk the path. Each time we hit an array, recurse down the path
            var walk = FindPathRecursive(pkg.SourcePath.Skip(pathSkip), data);

            foreach (var value in walk)
            {
                if (value is ArrayList list)
                {
                    foreach (var item in list)
                    {
                        if (item != null)
                        {
                            yield return(item);
                        }
                    }
                }
                else
                {
                    yield return(value);
                }
            }
        }
Esempio n. 2
0
        private static object?GetDataAtPath(FilterState pkg)
        {
            var path = pkg.SourcePath;
            var data = pkg.Data;

            if (path == null || data == null)
            {
                return(null);
            }

            var root     = path[0];
            var pathSkip = 1;

            // Empty root means plain data, otherwise, we expect '#', 'D', 'P'
            if (root == "#") // Data filter
            {
                if (path.Length < 2)
                {
                    return(null);
                }
                var newFilter = pkg.RedirectFilter(path[1]);
                if (newFilter == null)
                {
                    return(null);
                }
                data = ApplyFilterRecursive(newFilter);
                if (data == null)
                {
                    return(null);
                }
                pathSkip = 2;     // root and filter name
            }
            else if (root == "D") // Page repeat
            {
                if (pkg.RepeaterData == null)
                {
                    throw new Exception("Was asked for repeat page data, but none was supplied");
                }
                if (path.Length < 2)
                {
                    return(null);
                }
                data     = pkg.RepeaterData;
                pathSkip = 1; // root 'D'
            }
            else if (root == "P")
            {
                return(GetPageInfoData(pkg));
            }
            else if (root == "!") // special "raw data" mode
            {
                return(string.Join(".", path.Skip(1)).Trim());
            }
            else if (path[0] != "")
            {
                throw new Exception($"Unexpected root marker: {path[0]}");
            }

            var sb     = new StringBuilder();
            var target = data;

            for (int i = pathSkip; i < path.Length; i++)
            {
                var name = path[i];

                sb.Append(".");
                sb.Append(name);
                if (name.StartsWith('[') && name.EndsWith(']'))
                {
                    // array reference.
                    if (!(target is ArrayList list))
                    {
                        return($"Invalid path: expected list, but was not at {sb}");
                    }
                    if (!int.TryParse(name.Trim('[', ']'), out var idx))
                    {
                        return($"Invalid path: malformed index at {sb}");
                    }
                    if (idx < 0 || idx >= list.Count)
                    {
                        return(null);
                    }

                    target = list[idx];
                }
                else
                {
                    if (!(target is Dictionary <string, object> dict))
                    {
                        return($"Invalid path: expected object, but was not at {sb}");
                    }
                    if (dict.ContainsKey(name))
                    {
                        target = dict[name];
                        continue;
                    }

                    return(null);
                }
            }

            return(target);
        }