scalar_leafs.go

 1package validator
 2
 3import (
 4	"github.com/vektah/gqlparser/ast"
 5	. "github.com/vektah/gqlparser/validator"
 6)
 7
 8func init() {
 9	AddRule("ScalarLeafs", func(observers *Events, addError AddErrFunc) {
10		observers.OnField(func(walker *Walker, field *ast.Field) {
11			if field.Definition == nil {
12				return
13			}
14
15			fieldType := walker.Schema.Types[field.Definition.Type.Name()]
16			if fieldType == nil {
17				return
18			}
19
20			if fieldType.IsLeafType() && len(field.SelectionSet) > 0 {
21				addError(
22					Message(`Field "%s" must not have a selection since type "%s" has no subfields.`, field.Name, fieldType.Name),
23					At(field.Position),
24				)
25			}
26
27			if !fieldType.IsLeafType() && len(field.SelectionSet) == 0 {
28				addError(
29					Message(`Field "%s" of type "%s" must have a selection of subfields.`, field.Name, field.Definition.Type.String()),
30					Suggestf(`"%s { ... }"`, field.Name),
31					At(field.Position),
32				)
33			}
34		})
35	})
36}