Exemplo n.º 1
0
        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));
        }