matrix_sdk_ffi/
timeline_event_filter.rs

1use std::sync::Arc;
2
3use matrix_sdk_ui::timeline::event_type_filter::TimelineEventTypeFilter as InnerTimelineEventTypeFilter;
4use ruma::events::{AnySyncTimelineEvent, TimelineEventType};
5
6use crate::event::{MessageLikeEventType, StateEventType};
7
8#[derive(uniffi::Object)]
9pub struct TimelineEventTypeFilter {
10    inner: InnerTimelineEventTypeFilter,
11}
12
13#[matrix_sdk_ffi_macros::export]
14impl TimelineEventTypeFilter {
15    #[uniffi::constructor]
16    pub fn include(event_types: Vec<FilterTimelineEventType>) -> Arc<Self> {
17        let event_types: Vec<TimelineEventType> =
18            event_types.iter().map(|t| t.clone().into()).collect();
19        Arc::new(Self { inner: InnerTimelineEventTypeFilter::Include(event_types) })
20    }
21
22    #[uniffi::constructor]
23    pub fn exclude(event_types: Vec<FilterTimelineEventType>) -> Arc<Self> {
24        let event_types: Vec<TimelineEventType> =
25            event_types.iter().map(|t| t.clone().into()).collect();
26        Arc::new(Self { inner: InnerTimelineEventTypeFilter::Exclude(event_types) })
27    }
28}
29
30impl TimelineEventTypeFilter {
31    /// Filters an [`event`] to decide whether it should be part of the timeline
32    /// based on [`AnySyncTimelineEvent::event_type()`].
33    pub(crate) fn filter(&self, event: &AnySyncTimelineEvent) -> bool {
34        self.inner.filter(event)
35    }
36}
37
38#[derive(uniffi::Enum, Clone)]
39pub enum FilterTimelineEventType {
40    MessageLike { event_type: MessageLikeEventType },
41    State { event_type: StateEventType },
42}
43
44impl From<FilterTimelineEventType> for TimelineEventType {
45    fn from(value: FilterTimelineEventType) -> TimelineEventType {
46        match value {
47            FilterTimelineEventType::MessageLike { event_type } => {
48                ruma::events::MessageLikeEventType::from(event_type).into()
49            }
50            FilterTimelineEventType::State { event_type } => {
51                ruma::events::StateEventType::from(event_type).into()
52            }
53        }
54    }
55}