aboutsummaryrefslogtreecommitdiff
path: root/internal/pushrules/validate.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/pushrules/validate.go')
-rw-r--r--internal/pushrules/validate.go85
1 files changed, 85 insertions, 0 deletions
diff --git a/internal/pushrules/validate.go b/internal/pushrules/validate.go
new file mode 100644
index 00000000..5d260f0b
--- /dev/null
+++ b/internal/pushrules/validate.go
@@ -0,0 +1,85 @@
+package pushrules
+
+import (
+ "fmt"
+ "regexp"
+)
+
+// ValidateRule checks the rule for errors. These follow from Sytests
+// and the specification.
+func ValidateRule(kind Kind, rule *Rule) []error {
+ var errs []error
+
+ if !validRuleIDRE.MatchString(rule.RuleID) {
+ errs = append(errs, fmt.Errorf("invalid rule ID: %s", rule.RuleID))
+ }
+
+ if len(rule.Actions) == 0 {
+ errs = append(errs, fmt.Errorf("missing actions"))
+ }
+ for _, action := range rule.Actions {
+ errs = append(errs, validateAction(action)...)
+ }
+
+ for _, cond := range rule.Conditions {
+ errs = append(errs, validateCondition(cond)...)
+ }
+
+ switch kind {
+ case OverrideKind, UnderrideKind:
+ // The empty list is allowed, but for JSON-encoding reasons,
+ // it must not be nil.
+ if rule.Conditions == nil {
+ errs = append(errs, fmt.Errorf("missing rule conditions"))
+ }
+
+ case ContentKind:
+ if rule.Pattern == "" {
+ errs = append(errs, fmt.Errorf("missing content rule pattern"))
+ }
+
+ case RoomKind, SenderKind:
+ // Do nothing.
+
+ default:
+ errs = append(errs, fmt.Errorf("invalid rule kind: %s", kind))
+ }
+
+ return errs
+}
+
+// validRuleIDRE is a regexp for valid IDs.
+//
+// TODO: the specification doesn't seem to say what the rule ID syntax
+// is. A Sytest fails if it contains a backslash.
+var validRuleIDRE = regexp.MustCompile(`^([^\\]+)$`)
+
+// validateAction returns issues with an Action.
+func validateAction(action *Action) []error {
+ var errs []error
+
+ switch action.Kind {
+ case NotifyAction, DontNotifyAction, CoalesceAction, SetTweakAction:
+ // Do nothing.
+
+ default:
+ errs = append(errs, fmt.Errorf("invalid rule action kind: %s", action.Kind))
+ }
+
+ return errs
+}
+
+// validateCondition returns issues with a Condition.
+func validateCondition(cond *Condition) []error {
+ var errs []error
+
+ switch cond.Kind {
+ case EventMatchCondition, ContainsDisplayNameCondition, RoomMemberCountCondition, SenderNotificationPermissionCondition:
+ // Do nothing.
+
+ default:
+ errs = append(errs, fmt.Errorf("invalid rule condition kind: %s", cond.Kind))
+ }
+
+ return errs
+}