mirror of
https://gitlab.com/famedly/conduit.git
synced 2025-07-27 17:28:36 +00:00
49 lines
1.8 KiB
Rust
49 lines
1.8 KiB
Rust
|
use ruma::{api::client::filter::RoomEventFilter, events::AnyTimelineEvent, serde::Raw};
|
||
|
|
||
|
pub fn filter_room_events<I: Iterator<Item = &Raw<AnyTimelineEvent>>>(
|
||
|
events: I,
|
||
|
filter: RoomEventFilter,
|
||
|
) {
|
||
|
events
|
||
|
.filter(|event| match &filter.types {
|
||
|
None => true,
|
||
|
Some(types) => types.iter().any(|t| {
|
||
|
t.as_str()
|
||
|
== event
|
||
|
.get_field::<String>("type")
|
||
|
.expect("room events should deserialize")
|
||
|
.expect("room events should have a type")
|
||
|
}),
|
||
|
})
|
||
|
.filter(|event| match &filter.not_types[..] {
|
||
|
[] => true,
|
||
|
not_types => not_types.iter().all(|t| {
|
||
|
t.as_str()
|
||
|
!= event
|
||
|
.get_field::<String>("type")
|
||
|
.expect("room events should deserialize")
|
||
|
.expect("room events should have a type")
|
||
|
}),
|
||
|
})
|
||
|
.filter(|event| match &filter.rooms {
|
||
|
None => true,
|
||
|
Some(rooms) => rooms.iter().any(|r| {
|
||
|
r.as_str()
|
||
|
== event
|
||
|
.get_field::<String>("room_id")
|
||
|
.expect("room events should deserialize")
|
||
|
.expect("room events should have a type")
|
||
|
}),
|
||
|
})
|
||
|
.filter(|event| match &filter.rooms {
|
||
|
None => true,
|
||
|
Some(rooms) => rooms.iter().all(|r| {
|
||
|
r.as_str()
|
||
|
!= event
|
||
|
.get_field::<String>("room_id")
|
||
|
.expect("room events should deserialize")
|
||
|
.expect("room events should have a type")
|
||
|
}),
|
||
|
});
|
||
|
}
|