private static IEnumerable <TomlObject> ProcessArray(TomlObject obj, ReadOnlyMemory <char> pathM) { var path = pathM.Span; if (path[0] != '[') { throw new ArgumentException("Expected array open breacket", nameof(pathM)); } for (int i = 1; i < path.Length; i++) { if (path[i] == ']') { if (i == 0) { throw new ArgumentException("Empty array indexer", nameof(pathM)); } var indexer = path.Slice(1, i - 1); var rest = pathM.Slice(i + 1); bool cont = rest.Length > 0; // select if (indexer.Length == 1 && indexer[0] == '*') { var ret = obj.GetAllArrayItems(); if (cont) { if (IsArray(rest.Span)) { return(ret.SelectMany(x => ProcessArray(x, rest))); } else if (IsDot(rest.Span)) { return(ret.SelectMany(x => ProcessDot(x, rest))); } else { throw new ArgumentException("Invalid expression after array indexer", nameof(pathM)); } } return(ret); } else { var ret = obj.GetArrayItemByIndex(indexer); if (ret is null) { return(Enumerable.Empty <TomlObject>()); } if (cont) { if (IsArray(rest.Span)) { return(ProcessArray(ret, rest)); } else if (IsDot(rest.Span)) { return(ProcessDot(ret, rest)); } else { throw new ArgumentException("Invalid expression after array indexer", nameof(pathM)); } } return(new[] { ret }); } } } throw new ArgumentException("Missing array close bracket", nameof(pathM)); }