1
0
Fork 0
mirror of https://gitlab.com/famedly/conduit.git synced 2025-07-27 17:28:36 +00:00
conduit/src/utils/filter.rs

49 lines
1.8 KiB
Rust
Raw Normal View History

2024-04-29 20:59:02 +02:00
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")
}),
});
}