From 96642e3a1b0c922fbfb522da79b20ecd8e9d6c7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Commaille?= Date: Fri, 4 Nov 2022 18:38:41 +0100 Subject: [PATCH] push: Add method to change the enabled state of push rules in a Ruleset --- crates/ruma-common/CHANGELOG.md | 1 + crates/ruma-common/src/push.rs | 50 +++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/crates/ruma-common/CHANGELOG.md b/crates/ruma-common/CHANGELOG.md index f09fee79..9ff6896d 100644 --- a/crates/ruma-common/CHANGELOG.md +++ b/crates/ruma-common/CHANGELOG.md @@ -38,6 +38,7 @@ Improvements: * Add convenience methods to `Ruleset` * `Ruleset::get` to access a push rule * `Ruleset::insert` to add or update user push rules + * `Ruleset::set_enabled` to change the enabled state of push rules # 0.10.5 diff --git a/crates/ruma-common/src/push.rs b/crates/ruma-common/src/push.rs index d059d537..58eb647b 100644 --- a/crates/ruma-common/src/push.rs +++ b/crates/ruma-common/src/push.rs @@ -186,6 +186,50 @@ impl Ruleset { } } + /// Set whether the rule from the given kind and with the given `rule_id` in the rule set is + /// enabled. + /// + /// Returns an error if the rule can't be found. + pub fn set_enabled( + &mut self, + kind: RuleKind, + rule_id: impl AsRef, + enabled: bool, + ) -> Result<(), RuleNotFoundError> { + let rule_id = rule_id.as_ref(); + + match kind { + RuleKind::Override => { + let mut rule = self.override_.get(rule_id).ok_or(RuleNotFoundError)?.clone(); + rule.enabled = enabled; + self.override_.replace(rule); + } + RuleKind::Underride => { + let mut rule = self.underride.get(rule_id).ok_or(RuleNotFoundError)?.clone(); + rule.enabled = enabled; + self.underride.replace(rule); + } + RuleKind::Sender => { + let mut rule = self.sender.get(rule_id).ok_or(RuleNotFoundError)?.clone(); + rule.enabled = enabled; + self.sender.replace(rule); + } + RuleKind::Room => { + let mut rule = self.room.get(rule_id).ok_or(RuleNotFoundError)?.clone(); + rule.enabled = enabled; + self.room.replace(rule); + } + RuleKind::Content => { + let mut rule = self.content.get(rule_id).ok_or(RuleNotFoundError)?.clone(); + rule.enabled = enabled; + self.content.replace(rule); + } + RuleKind::_Custom(_) => return Err(RuleNotFoundError), + } + + Ok(()) + } + /// Get the first push rule that applies to this event, if any. /// /// # Arguments @@ -725,6 +769,12 @@ pub enum InsertPushRuleError { BeforeHigherThanAfter, } +/// The error type returned when trying modify a push rule that could not be found in a `Ruleset`. +#[derive(Debug, Error)] +#[non_exhaustive] +#[error("The rule could not be found")] +pub struct RuleNotFoundError; + /// Insert the rule in the given indexset and move it to the given position. pub fn insert_and_move_rule( set: &mut IndexSet,