Ejemplo n.º 1
0
 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());
 }
Ejemplo n.º 2
0
 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);
 }
Ejemplo n.º 4
0
        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);
 }
Ejemplo n.º 6
0
 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());
         }
     }
 }
Ejemplo n.º 7
0
        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);
        }