common: Move AnyPushRule, RulesetIntoIter into separate module
This commit is contained in:
parent
f86fa08f13
commit
8171e34eac
@ -16,15 +16,13 @@
|
|||||||
|
|
||||||
use std::hash::{Hash, Hasher};
|
use std::hash::{Hash, Hasher};
|
||||||
|
|
||||||
use indexmap::{
|
use indexmap::{Equivalent, IndexSet};
|
||||||
set::{IndexSet, IntoIter as IndexSetIter},
|
|
||||||
Equivalent,
|
|
||||||
};
|
|
||||||
use ruma_serde::{Raw, StringEnum};
|
use ruma_serde::{Raw, StringEnum};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
mod action;
|
mod action;
|
||||||
mod condition;
|
mod condition;
|
||||||
|
mod iter;
|
||||||
mod predefined;
|
mod predefined;
|
||||||
|
|
||||||
pub use self::{
|
pub use self::{
|
||||||
@ -32,6 +30,7 @@ pub use self::{
|
|||||||
condition::{
|
condition::{
|
||||||
ComparisonOperator, FlattenedJson, PushCondition, PushConditionRoomCtx, RoomMemberCountIs,
|
ComparisonOperator, FlattenedJson, PushCondition, PushConditionRoomCtx, RoomMemberCountIs,
|
||||||
},
|
},
|
||||||
|
iter::{AnyPushRule, RulesetIntoIter},
|
||||||
};
|
};
|
||||||
|
|
||||||
/// A push ruleset scopes a set of rules according to some criteria.
|
/// A push ruleset scopes a set of rules according to some criteria.
|
||||||
@ -142,88 +141,6 @@ impl Ruleset {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Iterator type for `Ruleset`
|
|
||||||
#[derive(Debug)]
|
|
||||||
pub struct RulesetIntoIter {
|
|
||||||
content: IndexSetIter<PatternedPushRule>,
|
|
||||||
override_: IndexSetIter<ConditionalPushRule>,
|
|
||||||
room: IndexSetIter<SimplePushRule>,
|
|
||||||
sender: IndexSetIter<SimplePushRule>,
|
|
||||||
underride: IndexSetIter<ConditionalPushRule>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Iterator for RulesetIntoIter {
|
|
||||||
type Item = AnyPushRule;
|
|
||||||
|
|
||||||
fn next(&mut self) -> Option<Self::Item> {
|
|
||||||
self.override_
|
|
||||||
.next()
|
|
||||||
.map(AnyPushRule::Override)
|
|
||||||
.or_else(|| self.content.next().map(AnyPushRule::Content))
|
|
||||||
.or_else(|| self.room.next().map(AnyPushRule::Room))
|
|
||||||
.or_else(|| self.sender.next().map(AnyPushRule::Sender))
|
|
||||||
.or_else(|| self.underride.next().map(AnyPushRule::Underride))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl IntoIterator for Ruleset {
|
|
||||||
type Item = AnyPushRule;
|
|
||||||
type IntoIter = RulesetIntoIter;
|
|
||||||
|
|
||||||
fn into_iter(self) -> Self::IntoIter {
|
|
||||||
RulesetIntoIter {
|
|
||||||
content: self.content.into_iter(),
|
|
||||||
override_: self.override_.into_iter(),
|
|
||||||
room: self.room.into_iter(),
|
|
||||||
sender: self.sender.into_iter(),
|
|
||||||
underride: self.underride.into_iter(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// The kinds of push rules that are available.
|
|
||||||
#[derive(Clone, Debug)]
|
|
||||||
pub enum AnyPushRule {
|
|
||||||
/// Rules that override all other kinds.
|
|
||||||
Override(ConditionalPushRule),
|
|
||||||
|
|
||||||
/// Content-specific rules.
|
|
||||||
Content(PatternedPushRule),
|
|
||||||
|
|
||||||
/// Room-specific rules.
|
|
||||||
Room(SimplePushRule),
|
|
||||||
|
|
||||||
/// Sender-specific rules.
|
|
||||||
Sender(SimplePushRule),
|
|
||||||
|
|
||||||
/// Lowest priority rules.
|
|
||||||
Underride(ConditionalPushRule),
|
|
||||||
}
|
|
||||||
|
|
||||||
impl AnyPushRule {
|
|
||||||
/// Get the `rule_id` of the push rule.
|
|
||||||
pub fn rule_id(&self) -> &str {
|
|
||||||
match self {
|
|
||||||
Self::Override(rule) => &rule.rule_id,
|
|
||||||
Self::Underride(rule) => &rule.rule_id,
|
|
||||||
Self::Content(rule) => &rule.rule_id,
|
|
||||||
Self::Room(rule) => &rule.rule_id,
|
|
||||||
Self::Sender(rule) => &rule.rule_id,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Extend<AnyPushRule> for Ruleset {
|
|
||||||
fn extend<T>(&mut self, iter: T)
|
|
||||||
where
|
|
||||||
T: IntoIterator<Item = AnyPushRule>,
|
|
||||||
{
|
|
||||||
for rule in iter {
|
|
||||||
self.add(rule);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// A push rule is a single rule that states under what conditions an event should be passed onto a
|
/// A push rule is a single rule that states under what conditions an event should be passed onto a
|
||||||
/// push gateway and how the notification should be presented.
|
/// push gateway and how the notification should be presented.
|
||||||
///
|
///
|
||||||
|
85
ruma-common/src/push/iter.rs
Normal file
85
ruma-common/src/push/iter.rs
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
use indexmap::set::IntoIter as IndexSetIntoIter;
|
||||||
|
|
||||||
|
use super::{ConditionalPushRule, PatternedPushRule, Ruleset, SimplePushRule};
|
||||||
|
|
||||||
|
/// The kinds of push rules that are available.
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
pub enum AnyPushRule {
|
||||||
|
/// Rules that override all other kinds.
|
||||||
|
Override(ConditionalPushRule),
|
||||||
|
|
||||||
|
/// Content-specific rules.
|
||||||
|
Content(PatternedPushRule),
|
||||||
|
|
||||||
|
/// Room-specific rules.
|
||||||
|
Room(SimplePushRule),
|
||||||
|
|
||||||
|
/// Sender-specific rules.
|
||||||
|
Sender(SimplePushRule),
|
||||||
|
|
||||||
|
/// Lowest priority rules.
|
||||||
|
Underride(ConditionalPushRule),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl AnyPushRule {
|
||||||
|
/// Get the `rule_id` of the push rule.
|
||||||
|
pub fn rule_id(&self) -> &str {
|
||||||
|
match self {
|
||||||
|
Self::Override(rule) => &rule.rule_id,
|
||||||
|
Self::Underride(rule) => &rule.rule_id,
|
||||||
|
Self::Content(rule) => &rule.rule_id,
|
||||||
|
Self::Room(rule) => &rule.rule_id,
|
||||||
|
Self::Sender(rule) => &rule.rule_id,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Extend<AnyPushRule> for Ruleset {
|
||||||
|
fn extend<T>(&mut self, iter: T)
|
||||||
|
where
|
||||||
|
T: IntoIterator<Item = AnyPushRule>,
|
||||||
|
{
|
||||||
|
for rule in iter {
|
||||||
|
self.add(rule);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Iterator type for `Ruleset`
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct RulesetIntoIter {
|
||||||
|
content: IndexSetIntoIter<PatternedPushRule>,
|
||||||
|
override_: IndexSetIntoIter<ConditionalPushRule>,
|
||||||
|
room: IndexSetIntoIter<SimplePushRule>,
|
||||||
|
sender: IndexSetIntoIter<SimplePushRule>,
|
||||||
|
underride: IndexSetIntoIter<ConditionalPushRule>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Iterator for RulesetIntoIter {
|
||||||
|
type Item = AnyPushRule;
|
||||||
|
|
||||||
|
fn next(&mut self) -> Option<Self::Item> {
|
||||||
|
self.override_
|
||||||
|
.next()
|
||||||
|
.map(AnyPushRule::Override)
|
||||||
|
.or_else(|| self.content.next().map(AnyPushRule::Content))
|
||||||
|
.or_else(|| self.room.next().map(AnyPushRule::Room))
|
||||||
|
.or_else(|| self.sender.next().map(AnyPushRule::Sender))
|
||||||
|
.or_else(|| self.underride.next().map(AnyPushRule::Underride))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl IntoIterator for Ruleset {
|
||||||
|
type Item = AnyPushRule;
|
||||||
|
type IntoIter = RulesetIntoIter;
|
||||||
|
|
||||||
|
fn into_iter(self) -> Self::IntoIter {
|
||||||
|
RulesetIntoIter {
|
||||||
|
content: self.content.into_iter(),
|
||||||
|
override_: self.override_.into_iter(),
|
||||||
|
room: self.room.into_iter(),
|
||||||
|
sender: self.sender.into_iter(),
|
||||||
|
underride: self.underride.into_iter(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user