@@ -17,12 +17,15 @@ type Rule struct {
1717
1818var 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.
2222func 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
2629func 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+
3762func Validate (schema * Schema , doc * QueryDocument , rules ... Rule ) gqlerror.List {
3863 if rules == nil {
3964 rules = specifiedRules
0 commit comments