Skip to content

Commit e21b122

Browse files
Add replace rule function (vektah#338)
Signed-off-by: Steve Coffman <steve@khanacademy.org>
1 parent 6558e6f commit e21b122

File tree

1 file changed

+27
-2
lines changed

1 file changed

+27
-2
lines changed

validator/validator.go

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,15 @@ type Rule struct {
1717

1818
var specifiedRules []Rule
1919

20-
// AddRule adds rule to the rule set.
21-
// f is called once each time `Validate` is executed.
20+
// AddRule adds a rule to the rule set.
21+
// ruleFunc is called once each time `Validate` is executed.
2222
func AddRule(name string, ruleFunc RuleFunc) {
2323
specifiedRules = append(specifiedRules, Rule{Name: name, RuleFunc: ruleFunc})
2424
}
2525

26+
// RemoveRule removes an existing rule from the rule set
27+
// if one of the same name exists.
28+
// The rule set is global, so it is not safe for concurrent changes
2629
func RemoveRule(name string) {
2730
var result []Rule // nolint:prealloc // using initialized with len(rules) produces a race condition
2831
for _, r := range specifiedRules {
@@ -34,6 +37,28 @@ func RemoveRule(name string) {
3437
specifiedRules = result
3538
}
3639

40+
// ReplaceRule replaces an existing rule from the rule set
41+
// if one of the same name exists.
42+
// If no match is found, it will add a new rule to the rule set.
43+
// The rule set is global, so it is not safe for concurrent changes
44+
func ReplaceRule(name string, ruleFunc RuleFunc) {
45+
var found bool
46+
var result []Rule // nolint:prealloc // using initialized with len(rules) produces a race condition
47+
for _, r := range specifiedRules {
48+
if r.Name == name {
49+
found = true
50+
result = append(result, Rule{Name: name, RuleFunc: ruleFunc})
51+
continue
52+
}
53+
result = append(result, r)
54+
}
55+
if !found {
56+
specifiedRules = append(specifiedRules, Rule{Name: name, RuleFunc: ruleFunc})
57+
return
58+
}
59+
specifiedRules = result
60+
}
61+
3762
func Validate(schema *Schema, doc *QueryDocument, rules ...Rule) gqlerror.List {
3863
if rules == nil {
3964
rules = specifiedRules

0 commit comments

Comments
 (0)