public static IError NoSelectionOnCompositeField( this IDocumentValidatorContext context, FieldNode node, IComplexOutputType declaringType, IType fieldType) { return(ErrorBuilder.New() .SetMessage( Resources.ErrorHelper_NoSelectionOnCompositeField, node.Name.Value) .AddLocation(node) .SetPath(context.CreateErrorPath()) .SetExtension("declaringType", declaringType.Name) .SetExtension("field", node.Name.Value) .SetExtension("type", fieldType.Print()) .SetExtension("responseName", (node.Alias ?? node.Name).Value) .SpecifiedBy("sec-Field-Selections-on-Objects-Interfaces-and-Unions-Types") .Build()); }
public static IError LeafFieldsCannotHaveSelections( this IDocumentValidatorContext context, FieldNode node, IComplexOutputType declaringType, IType fieldType) { return(ErrorBuilder.New() .SetMessage( Resources.ErrorHelper_LeafFieldsCannotHaveSelections, node.Name.Value, fieldType.IsScalarType() ? "a scalar" : "an enum") .AddLocation(node) .SetPath(context.CreateErrorPath()) .SetExtension("declaringType", declaringType.Name) .SetExtension("field", node.Name.Value) .SetExtension("type", fieldType.Print()) .SetExtension("responseName", (node.Alias ?? node.Name).Value) .SpecifiedBy("sec-Leaf-Field-Selections") .Build()); }
protected override ISyntaxVisitorAction Enter( FieldNode node, IDocumentValidatorContext context) { if (context.Types.Peek() is IComplexOutputType ct && !FieldExists(ct, node.Name.Value)) { context.Errors.Add( ErrorBuilder.New() .SetMessage( $"The field `{node.Name.Value}` does not exist " + $"on the type `{ct.Name}`.") .AddLocation(node) .SetPath(context.CreateErrorPath()) .SpecifiedBy("sec-Field-Selections-on-Objects-Interfaces-and-Unions-Types") .Build()); return(Skip); } return(Continue); }
protected override ISyntaxVisitorAction Enter( VariableNode node, IDocumentValidatorContext context) { ISyntaxNode parent = context.Path.Peek(); IValueNode? defaultValue; switch (parent.Kind) { case NodeKind.Argument: case NodeKind.ObjectField: defaultValue = context.InputFields.Peek().DefaultValue; break; default: defaultValue = null; break; } if (context.Variables.TryGetValue( node.Name.Value, out VariableDefinitionNode? variableDefinition) && !IsVariableUsageAllowed(variableDefinition, context.Types.Peek(), defaultValue)) { string variableName = variableDefinition.Variable.Name.Value; context.Errors.Add( ErrorBuilder.New() .SetMessage( $"The variable `{variableName}` is not compatible " + "with the type of the current location.") .AddLocation(node) .SetPath(context.CreateErrorPath()) .SetExtension("variable", variableName) .SetExtension("variableType", variableDefinition.Type.ToString()) .SetExtension("locationType", context.Types.Peek().Visualize()) .SpecifiedBy("sec-All-Variable-Usages-are-Allowed") .Build()); } return(Skip); }
protected override ISyntaxVisitorAction Enter( SelectionSetNode node, IDocumentValidatorContext context) { if (context.Types.TryPeek(out IType type) && type.NamedType().IsUnionType() && HasFields(node)) { context.Errors.Add( ErrorBuilder.New() .SetMessage( "A union type cannot declare a field directly. " + "Use inline fragments or fragments instead") .AddLocation(node) .SetPath(context.CreateErrorPath()) .SpecifiedBy("sec-Field-Selections-on-Objects-Interfaces-and-Unions-Types") .Build()); return(Skip); } return(Continue); }
private void ValidateDirectiveAreUniquePerLocation <T>( T node, IDocumentValidatorContext context) where T : ISyntaxNode, Language.IHasDirectives { context.Names.Clear(); foreach (DirectiveNode directive in node.Directives) { if (context.Schema.TryGetDirectiveType(directive.Name.Value, out DirectiveType? dt) && !dt.IsRepeatable && !context.Names.Add(directive.Name.Value)) { context.Errors.Add( ErrorBuilder.New() .SetMessage("Only one of each directive is allowed per location.") .AddLocation(node) .SetPath(context.CreateErrorPath()) .SpecifiedBy("sec-Directives-Are-Unique-Per-Location") .Build()); } } }
protected override ISyntaxVisitorAction Leave( DocumentNode node, IDocumentValidatorContext context) { foreach (string fragmentName in context.Fragments.Keys) { if (context.Names.Add(fragmentName)) { context.Errors.Add( ErrorBuilder.New() .SetMessage( $"The specified fragment `{fragmentName}` " + "is not used within the current document.") .AddLocation(context.Fragments[fragmentName]) .SetPath(context.CreateErrorPath()) .SetExtension("fragment", fragmentName) .SpecifiedBy("sec-Fragments-Must-Be-Used") .Build()); } } return(Continue); }