Ejemplo n.º 1
0
        private static IEnumerable <Argument> ParseArguments(ListIterator <Token> iterator)
        {
            for (; ;)
            {
                var token = AssertNotEof(iterator.FirstOrDefault());

                if (token is PunctuatorToken && token.Value.Equals(")"))
                {
                    yield break;
                }
                else if (!(token is NameToken))
                {
                    throw new ParserException();
                }

                var(location, name) = token;

                token = AssertNotEof(iterator.FirstOrDefault());

                if (!(token is PunctuatorToken && token.Value.Equals(":")))
                {
                    throw new ParserException();
                }

                token = AssertNotEof(iterator.FirstOrDefault());

                var value = ParseValue(ref token, iterator);

                yield return(new Argument(name, location, value));
            }
        }
Ejemplo n.º 2
0
        private static OperationDefinition ParseQuery(ref Token token, ListIterator <Token> iterator)
        {
            string operationName = null;

            if (token is NameToken)
            {
                operationName = token.Value;

                token = AssertNotEof(iterator.FirstOrDefault());
            }

            IEnumerable <VariableDefinition> variableDefinitions = null;

            if (token is PunctuatorToken && token.Value.Equals("("))
            {
                variableDefinitions = ParseVariableDefinitions(iterator)
                                      .ToList();

                token = AssertNotEof(iterator.FirstOrDefault());
            }

            var directives = ParseDirectives(ref token, iterator);

            if (token is PunctuatorToken && token.Value.Equals("{"))
            {
                token = AssertNotEof(iterator.FirstOrDefault());

                var selectionSet = ParseSelectionSet(ref token, iterator);

                return(new OperationDefinition(OperationType.Query, operationName, variableDefinitions, directives, selectionSet));
            }

            throw new ParserException($"Syntax error at {token.Location}. Expected 'query' or '{{', got {token.Value}");
        }
Ejemplo n.º 3
0
        private static IEnumerable <Directive> ParseDirectives(ref Token token, ListIterator <Token> iterator)
        {
            var result = new List <Directive>();

            for (; token is PunctuatorToken && token.Value.Equals("@");)
            {
                token = AssertNotEof(iterator.FirstOrDefault());

                if (!(token is NameToken))
                {
                    throw new ParserException();
                }

                var name = token.Value;

                token = AssertNotEof(iterator.FirstOrDefault());

                if (token is PunctuatorToken && token.Value.Equals("("))
                {
                    result.Add(new Directive(name, ParseArguments(iterator)));
                }
                else
                {
                    result.Add(new Directive(name, null));
                }
            }

            return(result.Count == 0 ? null : result);
        }
Ejemplo n.º 4
0
        private static IEnumerable <VariableDefinition> ParseVariableDefinitions(ListIterator <Token> iterator)
        {
            var token = AssertNotEof(iterator.FirstOrDefault());

            for (; ;)
            {
                if (token is PunctuatorToken && token.Value.Equals(")"))
                {
                    break;
                }

                if (!(token is PunctuatorToken && token.Value.Equals("$")))
                {
                    throw new ParserException();
                }

                var location = token.Location;

                token = AssertNotEof(iterator.FirstOrDefault());

                if (!(token is NameToken))
                {
                    throw new ParserException();
                }

                var name = token.Value;

                token = AssertNotEof(iterator.FirstOrDefault());

                if (!(token is PunctuatorToken && token.Value.Equals(":")))
                {
                    throw new ParserException();
                }

                token = AssertNotEof(iterator.FirstOrDefault());

                var type = ParseInputType(ref token, iterator);

                Value defaultValue = null;

                if (token is PunctuatorToken && token.Value.Equals("="))
                {
                    token = AssertNotEof(iterator.FirstOrDefault());

                    defaultValue = ParseValue(ref token, iterator);
                }

                yield return(new VariableDefinition(name, type, defaultValue, location));
            }
        }
Ejemplo n.º 5
0
        private IEnumerable <Definition> ParseDefinitions(ListIterator <Token> iterator)
        {
            var token = iterator.FirstOrDefault();

            if (token == null)
            {
                yield break;
            }

            for (; ;)
            {
                if (token is NameToken)
                {
                    if (token.Value.Equals("query"))
                    {
                        token = AssertNotEof(iterator.FirstOrDefault());

                        yield return(ParseQuery(ref token, iterator));
                    }
                    else if (token.Value.Equals("mutation"))
                    {
                        //AssertNotEof(iterator.FirstOrDefault());

                        yield return(ParseMutation(iterator));
                    }
                    else if (token.Value.Equals("fragment"))
                    {
                        AssertNotEof(iterator.FirstOrDefault());

                        yield return(ParseFragment(iterator));
                    }
                }
                else if (token is PunctuatorToken && token.Value.Equals("{"))
                {
                    yield return(ParseQuery(ref token, iterator));
                }
                else
                {
                    throw new ParserException();
                }

                token = iterator.FirstOrDefault();

                if (token == null)
                {
                    break;
                }
            }
        }
Ejemplo n.º 6
0
        private static FragmentDefinition ParseFragment(ListIterator <Token> iterator)
        {
            var token = AssertNotEof(iterator.FirstOrDefault());

            if (!(token is NameToken))
            {
                throw new ParserException();
            }

            var name = token.Value;

            if (name.Equals("on"))
            {
                throw new ParserException();
            }

            token = AssertNotEof(iterator.FirstOrDefault());

            if (!(token is NameToken && token.Value.Equals("on")))
            {
                throw new ParserException();
            }

            token = AssertNotEof(iterator.FirstOrDefault());

            if (!(token is NameToken))
            {
                throw new ParserException();
            }

            var type = token.Value;

            token = AssertNotEof(iterator.FirstOrDefault());

            var directives = ParseDirectives(ref token, iterator);

            if (!(token is PunctuatorToken && token.Value.Equals("{")))
            {
                throw new ParserException();
            }

            token = AssertNotEof(iterator.FirstOrDefault());

            var selectionSet = ParseSelectionSet(ref token, iterator);

            return(new FragmentDefinition(name, type, directives, selectionSet));
        }
Ejemplo n.º 7
0
        private static InlineFragment ParseInlineFragment(ref Token token, ListIterator <Token> iterator)
        {
            string type = null;

            if (token is NameToken)
            {
                if (!token.Value.Equals("on"))
                {
                    throw new ParserException();
                }

                token = AssertNotEof(iterator.FirstOrDefault());

                if (!(token is NameToken))
                {
                    throw new ParserException();
                }

                type = token.Value;

                token = AssertNotEof(iterator.FirstOrDefault());
            }

            if (!(token is PunctuatorToken))
            {
                throw new ParserException();
            }

            IEnumerable <Directive> directives = null;

            if (token.Value.Equals("@"))
            {
                directives = ParseDirectives(ref token, iterator);
            }

            if (!token.Value.Equals("{"))
            {
                throw new ParserException();
            }

            token = AssertNotEof(iterator.FirstOrDefault());

            var selectionSet = ParseSelectionSet(ref token, iterator);

            return(new InlineFragment(type, directives, selectionSet));
        }
Ejemplo n.º 8
0
        private static InputType ParseInputType(ref Token token, ListIterator <Token> iterator)
        {
            if (token is PunctuatorToken && token.Value.Equals("["))
            {
                token = AssertNotEof(iterator.FirstOrDefault());

                var inputType = ParseInputType(ref token, iterator);

                // token is currently ']'
                token = AssertNotEof(iterator.FirstOrDefault());

                var       listType = new ListType(inputType);
                InputType result   = listType;

                if (token is PunctuatorToken && token.Value.Equals("!"))
                {
                    token = AssertNotEof(iterator.FirstOrDefault());

                    result = new NonNullType(listType);
                }

                return(result);
            }

            if (!(token is NameToken))
            {
                throw new ParserException();
            }

            var namedType = new NamedType(token.Value);

            token = AssertNotEof(iterator.FirstOrDefault());

            if (token is PunctuatorToken && token.Value.Equals("!"))
            {
                token = AssertNotEof(iterator.FirstOrDefault());

                return(new NonNullType(namedType));
            }

            return(namedType);
        }
Ejemplo n.º 9
0
        private static ObjectField ParseObjectField(ref Token token, ListIterator <Token> iterator)
        {
            if (!(token is NameToken))
            {
                throw new ParserException();
            }

            var name = token.Value;

            token = AssertNotEof(iterator.FirstOrDefault());

            if (!(token is PunctuatorToken && token.Value.Equals(":")))
            {
                throw new ParserException();
            }

            token = AssertNotEof(iterator.FirstOrDefault());

            var value = ParseValue(ref token, iterator);

            return(new ObjectField(name, value));
        }
Ejemplo n.º 10
0
        private static FragmentSpread ParseFragmentSpread(ref Token token, ListIterator <Token> iterator)
        {
            var name = token.Value;

            token = AssertNotEof(iterator.FirstOrDefault());

            IEnumerable <Directive> directives = null;

            if (token is PunctuatorToken && token.Value.Equals("@"))
            {
                directives = ParseDirectives(ref token, iterator);
            }

            return(new FragmentSpread(name, directives));
        }
Ejemplo n.º 11
0
        private static Selection ParseFragmentSelection(ref Token token, ListIterator <Token> iterator)
        {
            token = AssertNotEof(iterator.FirstOrDefault());

            if (token is NameToken)
            {
                if (token.Value.Equals("on"))
                {
                    return(ParseInlineFragment(ref token, iterator));
                }

                return(ParseFragmentSpread(ref token, iterator));
            }

            return(ParseInlineFragment(ref token, iterator));
        }
Ejemplo n.º 12
0
        private static Field ParseField(ref Token token, ListIterator <Token> iterator)
        {
            string alias = null;

            var(location, name) = token;

            token = AssertNotEof(iterator.FirstOrDefault());

            if (token is PunctuatorToken && token.Value.Equals(":"))
            {
                token = AssertNotEof(iterator.FirstOrDefault());

                if (!(token is NameToken))
                {
                    throw new ParserException();
                }

                alias = name;
                name  = token.Value;

                token = AssertNotEof(iterator.FirstOrDefault());
            }

            IEnumerable <Argument> arguments = null;

            if (token is PunctuatorToken && token.Value.Equals("("))
            {
                arguments = ParseArguments(iterator)
                            .ToList();

                token = AssertNotEof(iterator.FirstOrDefault());
            }

            IEnumerable <Directive> directives = null;

            if (token is PunctuatorToken && token.Value.Equals("@"))
            {
                directives = ParseDirectives(ref token, iterator);
            }

            IEnumerable <Selection> selectionSet = null;

            if (token is PunctuatorToken && token.Value.Equals("{"))
            {
                token = AssertNotEof(iterator.FirstOrDefault());

                selectionSet = ParseSelectionSet(ref token, iterator);

                token = AssertNotEof(iterator.FirstOrDefault());
            }

            return(new Field(name, alias, arguments, directives, selectionSet, location));
        }
Ejemplo n.º 13
0
        private static ListValue ParseListValue(ref Token token, ListIterator <Token> iterator)
        {
            var items = new List <Value>();

            for (; ;)
            {
                token = AssertNotEof(iterator.FirstOrDefault());

                if (token is PunctuatorToken && token.Value.Equals("]"))
                {
                    break;
                }

                items.Add(ParseValue(ref token, iterator));
            }

            return(new ListValue(items));
        }
Ejemplo n.º 14
0
        private static ObjectValue ParseObjectValue(ref Token token, ListIterator <Token> iterator)
        {
            var fields = new List <ObjectField>();

            for (; ;)
            {
                token = AssertNotEof(iterator.FirstOrDefault());

                if (token is PunctuatorToken && token.Value.Equals("}"))
                {
                    break;
                }

                fields.Add(ParseObjectField(ref token, iterator));
            }

            return(new ObjectValue(fields));
        }
Ejemplo n.º 15
0
        private static Value TryParseValue(ref Token token, ListIterator <Token> iterator)
        {
            if (token is PunctuatorToken)
            {
                if (token.Value.Equals("$"))
                {
                    var location = token.Location;

                    token = AssertNotEof(iterator.FirstOrDefault());

                    if (!(token is NameToken))
                    {
                        throw new ParserException();
                    }

                    return(new Variable(token.Value, location));
                }

                if (token.Value.Equals("{"))
                {
                    return(ParseObjectValue(ref token, iterator));
                }

                if (token.Value.Equals("["))
                {
                    return(ParseListValue(ref token, iterator));
                }

                throw new ParserException();
            }

            if (token is IntValueToken intValueToken)
            {
                return(new IntValue(intValueToken.IntValue));
            }

            if (token is FloatValueToken floatValueToken)
            {
                return(new FloatValue(floatValueToken.DecimalValue));
            }

            if (token is StringValueToken)
            {
                return(new StringValue(token.Value));
            }

            if (token is NameToken)
            {
                if (token.Value.Equals("true"))
                {
                    return(new BooleanValue(true));
                }

                if (token.Value.Equals("false"))
                {
                    return(new BooleanValue(false));
                }

                if (token.Value.Equals("null"))
                {
                    return(new NullValue());
                }

                return(new EnumValue(token.Value));
            }

            throw new ParserException();
        }