public void VisitScalar(ValidationContext context, GraphQLVariableDefinition variable, VariableName variableName, ScalarGraphType type, object?variableValue, object?parsedValue)
 {
     foreach (var visitor in _visitors)
     {
         visitor.VisitScalar(context, variable, variableName, type, variableValue, parsedValue);
     }
 }
Esempio n. 2
0
        public override GraphQLVariableDefinition BeginVisitVariableDefinition(GraphQLVariableDefinition node)
        {
            var name         = node.Variable.Name.Value;
            var defaultValue = node.DefaultValue;
            var type         = this.GetInputType(node.Type);

            if (type is GraphQLNonNull && defaultValue != null)
            {
                var guessType = ((GraphQLNonNull)type).UnderlyingNullableType;
                this.Errors.Add(new GraphQLException(
                                    this.ComposeDefaultForNonNullArgMessage(
                                        name,
                                        type,
                                        guessType),
                                    new[] { defaultValue }));
            }

            if (type != null && defaultValue != null)
            {
                var errors = this.LiteralValueValidator.IsValid(type, defaultValue);

                if (errors != null && errors.Any())
                {
                    this.Errors.Add(new GraphQLException(
                                        this.ComposeBadValueForDefaultArgMessage(
                                            name,
                                            type,
                                            defaultValue.ToString(),
                                            errors.Select(e => e.Message).ToArray()),
                                        new[] { defaultValue }));
                }
            }

            return(base.BeginVisitVariableDefinition(node));
        }
 public void VisitField(ValidationContext context, GraphQLVariableDefinition variable, VariableName variableName, IInputObjectGraphType type, FieldType field, object?variableValue, object?parsedValue)
 {
     foreach (var visitor in _visitors)
     {
         visitor.VisitField(context, variable, variableName, type, field, variableValue, parsedValue);
     }
 }
Esempio n. 4
0
        public override GraphQLVariableDefinition BeginVisitVariableDefinition(
            GraphQLVariableDefinition node)
        {
            Tracker.EnterVariableDefinition?.Invoke(node);

            var _ = base.BeginVisitVariableDefinition(node);

            Tracker.LeaveVariableDefinition?.Invoke(node);
            return(_);
        }
        public override GraphQLVariableDefinition BeginVisitVariableDefinition(GraphQLVariableDefinition node)
        {
            var name = node.Variable.Name.Value;

            if (!this.variableDefinitions.ContainsKey(name))
            {
                this.variableDefinitions.Add(node.Variable.Name.Value, node);
            }

            return(base.BeginVisitVariableDefinition(node));
        }
        public override GraphQLVariableDefinition BeginVisitVariableDefinition(GraphQLVariableDefinition variableDefinition)
        {
            var variableName = variableDefinition.Variable.Name.Value;
            var inputType    = this.GetOutputType(variableDefinition.Type);

            if (inputType != null)
            {
                this.Errors.Add(new GraphQLException($"Variable \"${variableName}\" cannot be non-input type \"{variableDefinition.Type}\".",
                                                     new[] { variableDefinition.Type }));
            }

            return(variableDefinition);
        }
Esempio n. 7
0
        private string PrintVariableDefinition(GraphQLVariableDefinition variableDefinition)
        {
            var variable     = PrintVariable(variableDefinition.Variable);
            var type         = Print(variableDefinition.Type);
            var defaultValue = variableDefinition.DefaultValue?.ToString();

            return(Join(new[]
            {
                variable,
                ": ",
                type,
                Wrap(" = ", defaultValue)
            }));
        }
        public VariableDefinition VariableDefinition(GraphQLVariableDefinition source)
        {
            var def = new VariableDefinition(Name(source.Variable.Name)).WithLocation(source, _body);

            def.Type = Type(source.Type);
            if (source.DefaultValue is GraphQLValue val)
            {
                def.DefaultValue = Value(val);
            }
            else if (source.DefaultValue != null && !(source.DefaultValue is GraphQLValue))
            {
                throw new ExecutionError($"Unknown default value: {source.DefaultValue}");
            }
            return(def);
        }
Esempio n. 9
0
        public VariableDefinition VariableDefinition(GraphQLVariableDefinition source)
        {
            var def = new VariableDefinition(Name(source.Variable.Name)).WithLocation(source);

            def.CommentNode = Comment(source.Comment);
            def.Type        = Type(source.Type);
            if (source.DefaultValue is GraphQLValue val)
            {
                def.DefaultValue = Value(val);
            }
            else if (source.DefaultValue != null && !(source.DefaultValue is GraphQLValue))
            {
                throw new InvalidOperationException($"Unknown default value: {source.DefaultValue}");
            }
            return(def);
        }
Esempio n. 10
0
        public override GraphQLVariableDefinition BeginVisitVariableDefinition(GraphQLVariableDefinition node)
        {
            var variableName = node.Variable.Name.Value;

            if (this.knownVariableNames.ContainsKey(variableName))
            {
                this.ReportVariableNameError(variableName,
                                             new[] { this.knownVariableNames[variableName], node.Variable.Name });
            }
            else
            {
                this.knownVariableNames.Add(variableName, node.Variable.Name);
            }

            return(base.BeginVisitVariableDefinition(node));
        }
Esempio n. 11
0
        /// <summary>
        /// Converts a variable definition node and its children.
        /// </summary>
        private static VariableDefinition VariableDefinition(GraphQLVariableDefinition source)
        {
            var def = new VariableDefinition(Name(source.Variable.Name))
            {
                SourceLocation = Convert(source.Location),
                CommentNode    = Comment(source.Comment),
                Type           = Type(source.Type)
            };

            if (source.DefaultValue is GraphQLValue val)
            {
                def.DefaultValue = Value(val);
            }
            else if (source.DefaultValue != null && !(source.DefaultValue is GraphQLValue))
            {
                throw new InvalidOperationException($"Unknown default value: {source.DefaultValue}");
            }
            return(def);
        }
Esempio n. 12
0
            public override void VisitField(ValidationContext context, GraphQLVariableDefinition variable, VariableName variableName, IInputObjectGraphType type, FieldType field, object? variableValue, object? parsedValue)
            {
                var lengthDirective = field.FindAppliedDirective("length");
                if (lengthDirective == null)
                    return;

                var min = lengthDirective.FindArgument("min")?.Value;
                var max = lengthDirective.FindArgument("max")?.Value;

                if (parsedValue == null)
                {
                    if (min != null)
                        context.ReportError(new InputFieldsAndArgumentsOfCorrectLengthError(context, variable, variableName, null, (int?)min, (int?)max));
                }
                else if (parsedValue is string str)
                {
                    if (min != null && str.Length < (int)min || max != null && str.Length > (int)max)
                        context.ReportError(new InputFieldsAndArgumentsOfCorrectLengthError(context, variable, variableName, str.Length, (int?)min, (int?)max));
                }
            }
 private GraphQLBaseType GetEffectiveType(GraphQLBaseType type, GraphQLVariableDefinition definition)
 {
     return(definition.DefaultValue == null || type is GraphQLNonNull
         ? type
         : new GraphQLNonNull(type));
 }
Esempio n. 14
0
 /// <inheritdoc/>
 public virtual void VisitField(ValidationContext context, GraphQLVariableDefinition variable, VariableName variableName, IInputObjectGraphType type, FieldType field, object?variableValue, object?parsedValue)
 {
 }
        public override GraphQLVariableDefinition BeginVisitVariableDefinition(GraphQLVariableDefinition node)
        {
            this.variableDefinitions.Add(node);

            return(base.BeginVisitVariableDefinition(node));
        }
Esempio n. 16
0
 /// <inheritdoc/>
 public virtual void VisitList(ValidationContext context, GraphQLVariableDefinition variable, VariableName variableName, ListGraphType type, object?variableValue, IList <object?>?parsedValue)
 {
 }
Esempio n. 17
0
        public virtual GraphQLVariableDefinition BeginVisitVariableDefinition(GraphQLVariableDefinition node)
        {
            BeginVisitNode(node.Type);

            return(node);
        }
Esempio n. 18
0
 /// <summary>
 /// Initializes a new instance with the specified properties.
 /// </summary>
 public VariablesAreInputTypesError(ValidationContext context, GraphQLVariableDefinition node, IGraphType type)
     : base(context.Document.Source, NUMBER, UndefinedVarMessage(node.Variable.Name.StringValue, type?.ToString() ?? node.Type.Name()), node)
 {
 }
Esempio n. 19
0
 /// <inheritdoc/>
 public virtual void VisitScalar(ValidationContext context, GraphQLVariableDefinition variable, VariableName variableName, ScalarGraphType type, object?variableValue, object?parsedValue)
 {
 }
 /// <summary>
 /// Initializes a new instance with the specified properties.
 /// </summary>
 public InputFieldsAndArgumentsOfCorrectLengthError(ValidationContext context, GraphQLVariableDefinition node, VariableName variableName, int?length, int?min, int?max)
     : base(context.Document.Source, NUMBER, BadValueMessage(variableName, length, min, max), node)
 {
 }
Esempio n. 21
0
 /// <summary>
 /// Initializes a new instance with the specified properties.
 /// </summary>
 public UniqueVariableNamesError(ValidationContext context, GraphQLVariableDefinition node, GraphQLVariableDefinition altNode)
     : base(context.Document.Source, NUMBER, DuplicateVariableMessage(node.Variable.Name.StringValue), node, altNode)
 {
 }
Esempio n. 22
0
        /// <summary>
        /// Return the specified variable's value for the document from the attached <see cref="Variables"/> object.
        /// <br/><br/>
        /// Validates and parses the supplied input object according to the variable's type, and converts the object
        /// with <see cref="ScalarGraphType.ParseValue(object)"/> and
        /// <see cref="IInputObjectGraphType.ParseDictionary(IDictionary{string, object})"/> as applicable.
        /// <br/><br/>
        /// Since v3.3, returns null for variables set to null rather than the variable's default value.
        /// </summary>
        private object?GetVariableValue(IGraphType graphType, GraphQLVariableDefinition variableDef, object?input, IVariableVisitor?visitor)
        {
            return(ParseValue(graphType, variableDef, variableDef.Variable.Name.StringValue, input, visitor)); //ISSUE:allocation

            // Coerces a value depending on the graph type.
            object?ParseValue(IGraphType type, GraphQLVariableDefinition variableDef, VariableName variableName, object?value, IVariableVisitor?visitor)
            {
                if (type is IInputObjectGraphType inputObjectGraphType)
                {
                    var parsedValue = ParseValueObject(inputObjectGraphType, variableDef, variableName, value, visitor);
                    visitor?.VisitObject(this, variableDef, variableName, inputObjectGraphType, value, parsedValue);
                    return(parsedValue);
                }
                else if (type is NonNullGraphType nonNullGraphType)
                {
                    if (value == null)
                    {
                        throw new InvalidVariableError(this, variableDef, variableName, "Received a null input for a non-null variable.");
                    }

                    return(ParseValue(nonNullGraphType.ResolvedType !, variableDef, variableName, value, visitor));
                }
                else if (type is ListGraphType listGraphType)
                {
                    var parsedValue = ParseValueList(listGraphType, variableDef, variableName, value, visitor);
                    visitor?.VisitList(this, variableDef, variableName, listGraphType, value, parsedValue);
                    return(parsedValue);
                }
                else if (type is ScalarGraphType scalarGraphType)
                {
                    var parsedValue = ParseValueScalar(scalarGraphType, variableDef, variableName, value);
                    visitor?.VisitScalar(this, variableDef, variableName, scalarGraphType, value, parsedValue);
                    return(parsedValue);
                }
                else
                {
                    throw new InvalidVariableError(this, variableDef, variableName, $"The graph type '{type.Name}' is not an input graph type.");
                }
            }

            // Coerces a scalar value
            object?ParseValueScalar(ScalarGraphType scalarGraphType, GraphQLVariableDefinition variableDef, VariableName variableName, object?value)
            {
                try
                {
                    return(scalarGraphType.ParseValue(value));
                }
                catch (Exception ex)
                {
                    throw new InvalidVariableError(this, variableDef, variableName, $"Unable to convert '{value}' to '{scalarGraphType.Name}'", ex);
                }
            }

            IList <object?>?ParseValueList(ListGraphType listGraphType, GraphQLVariableDefinition variableDef, VariableName variableName, object?value, IVariableVisitor?visitor)
            {
                if (value == null)
                {
                    return(null);
                }

                // note: a list can have a single child element which will automatically be interpreted as a list of 1 elements. (see below rule)
                // so, to prevent a string as being interpreted as a list of chars (which get converted to strings), we ignore considering a string as an IEnumerable
                if (value is IEnumerable values && value is not string)
                {
                    // create a list containing the parsed elements in the input list
                    if (values is IList list)
                    {
                        var valueOutputs = new object?[list.Count];
                        for (int index = 0; index < list.Count; index++)
                        {
                            // parse/validate values as required by graph type
                            valueOutputs[index] = ParseValue(listGraphType.ResolvedType !, variableDef, new VariableName(variableName, index), list[index], visitor);
                        }
                        return(valueOutputs);
                    }
                    else
                    {
                        var valueOutputs = new List <object?>(values is ICollection collection ? collection.Count : 0);
                        int index        = 0;
                        foreach (object val in values)
                        {
                            // parse/validate values as required by graph type
                            valueOutputs.Add(ParseValue(listGraphType.ResolvedType !, variableDef, new VariableName(variableName, index++), val, visitor));
                        }
                        return(valueOutputs);
                    }
                }
Esempio n. 23
0
 /// <summary>
 /// Initializes a new instance of the <see cref="InvalidVariableError"/> class for a specified variable
 /// and error message. Loads any exception data from the inner exception into this instance.
 /// </summary>
 public InvalidVariableError(ValidationContext context, GraphQLVariableDefinition node, VariableName variableName, string message, Exception innerException)
     : base(context.Document.Source, NUMBER, $"Variable '${variableName}' is invalid. {message}", innerException, node)
 {
     Code = "INVALID_VALUE";
 }
 /// <summary>
 /// Initializes a new instance with the specified properties.
 /// </summary>
 public NoUnusedVariablesError(ValidationContext context, GraphQLVariableDefinition node, GraphQLOperationDefinition op)
     : base(context.Document.Source, NUMBER, UnusedVariableMessage(node.Variable.Name.StringValue, op.Name?.StringValue), node)
 {
 }
 /// <summary>
 /// Initializes a new instance with the specified properties.
 /// </summary>
 public VariablesInAllowedPositionError(ValidationContext context, GraphQLVariableDefinition varDef, IGraphType varType, VariableUsage usage)
     : base(context.Document.Source, NUMBER, BadVarPosMessage(usage.Node.Name.StringValue, varType.ToString() !, usage.Type.ToString() !))
 /// <summary>
 /// Initializes a new instance with the specified properties.
 /// </summary>
 public DefaultValuesOfCorrectTypeError(ValidationContext context, GraphQLVariableDefinition varDefAst, IGraphType inputType, string verboseErrors)
     : base(context.Document.Source, NUMBER, BadValueForDefaultArgMessage(varDefAst.Variable.Name.StringValue, inputType.ToString() !, varDefAst.DefaultValue !.Print(), verboseErrors), varDefAst.DefaultValue !)