validator.go

 1package validator
 2
 3import (
 4	. "github.com/vektah/gqlparser/ast"
 5	"github.com/vektah/gqlparser/gqlerror"
 6)
 7
 8type AddErrFunc func(options ...ErrorOption)
 9
10type ruleFunc func(observers *Events, addError AddErrFunc)
11
12type rule struct {
13	name string
14	rule ruleFunc
15}
16
17var rules []rule
18
19// addRule to rule set.
20// f is called once each time `Validate` is executed.
21func AddRule(name string, f ruleFunc) {
22	rules = append(rules, rule{name: name, rule: f})
23}
24
25func Validate(schema *Schema, doc *QueryDocument) gqlerror.List {
26	var errs gqlerror.List
27
28	observers := &Events{}
29	for i := range rules {
30		rule := rules[i]
31		rule.rule(observers, func(options ...ErrorOption) {
32			err := &gqlerror.Error{
33				Rule: rule.name,
34			}
35			for _, o := range options {
36				o(err)
37			}
38			errs = append(errs, err)
39		})
40	}
41
42	Walk(schema, doc, observers)
43	return errs
44}