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