known_argument_names.go

 1package validator
 2
 3import (
 4	"github.com/vektah/gqlparser/ast"
 5	. "github.com/vektah/gqlparser/validator"
 6)
 7
 8func init() {
 9	AddRule("KnownArgumentNames", func(observers *Events, addError AddErrFunc) {
10		// A GraphQL field is only valid if all supplied arguments are defined by that field.
11		observers.OnField(func(walker *Walker, field *ast.Field) {
12			if field.Definition == nil || field.ObjectDefinition == nil {
13				return
14			}
15			for _, arg := range field.Arguments {
16				def := field.Definition.Arguments.ForName(arg.Name)
17				if def != nil {
18					continue
19				}
20
21				var suggestions []string
22				for _, argDef := range field.Definition.Arguments {
23					suggestions = append(suggestions, argDef.Name)
24				}
25
26				addError(
27					Message(`Unknown argument "%s" on field "%s" of type "%s".`, arg.Name, field.Name, field.ObjectDefinition.Name),
28					SuggestListQuoted("Did you mean", arg.Name, suggestions),
29					At(field.Position),
30				)
31			}
32		})
33
34		observers.OnDirective(func(walker *Walker, directive *ast.Directive) {
35			if directive.Definition == nil {
36				return
37			}
38			for _, arg := range directive.Arguments {
39				def := directive.Definition.Arguments.ForName(arg.Name)
40				if def != nil {
41					continue
42				}
43
44				var suggestions []string
45				for _, argDef := range directive.Definition.Arguments {
46					suggestions = append(suggestions, argDef.Name)
47				}
48
49				addError(
50					Message(`Unknown argument "%s" on directive "@%s".`, arg.Name, directive.Name),
51					SuggestListQuoted("Did you mean", arg.Name, suggestions),
52					At(directive.Position),
53				)
54			}
55		})
56	})
57}