@@ -17,12 +17,15 @@ type Rule struct {
17
17
18
18
var specifiedRules []Rule
19
19
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.
22
22
func AddRule (name string , ruleFunc RuleFunc ) {
23
23
specifiedRules = append (specifiedRules , Rule {Name : name , RuleFunc : ruleFunc })
24
24
}
25
25
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
26
29
func RemoveRule (name string ) {
27
30
var result []Rule // nolint:prealloc // using initialized with len(rules) produces a race condition
28
31
for _ , r := range specifiedRules {
@@ -34,6 +37,28 @@ func RemoveRule(name string) {
34
37
specifiedRules = result
35
38
}
36
39
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
+
37
62
func Validate (schema * Schema , doc * QueryDocument , rules ... Rule ) gqlerror.List {
38
63
if rules == nil {
39
64
rules = specifiedRules
0 commit comments