matrix_sdk_ui/room_list_service/filters/
mod.rs1mod all;
55mod any;
56mod category;
57mod deduplicate_versions;
58mod favourite;
59mod fuzzy_match_room_name;
60mod invite;
61mod joined;
62mod low_priority;
63mod non_left;
64mod none;
65mod normalized_match_room_name;
66mod not;
67mod space;
68mod unread;
69
70pub use all::new_filter as new_filter_all;
71pub use any::new_filter as new_filter_any;
72pub use category::{RoomCategory, new_filter as new_filter_category};
73pub use deduplicate_versions::new_filter as new_filter_deduplicate_versions;
74pub use favourite::new_filter as new_filter_favourite;
75pub use fuzzy_match_room_name::new_filter as new_filter_fuzzy_match_room_name;
76pub use invite::new_filter as new_filter_invite;
77pub use joined::new_filter as new_filter_joined;
78pub use low_priority::new_filter as new_filter_low_priority;
79#[cfg(test)]
80use matrix_sdk::Client;
81#[cfg(test)]
82use matrix_sdk_test::{JoinedRoomBuilder, SyncResponseBuilder};
83pub use non_left::new_filter as new_filter_non_left;
84pub use none::new_filter as new_filter_none;
85pub use normalized_match_room_name::new_filter as new_filter_normalized_match_room_name;
86pub use not::new_filter as new_filter_not;
87#[cfg(test)]
88use ruma::RoomId;
89pub use space::new_filter as new_filter_space;
90use unicode_normalization::{UnicodeNormalization, char::is_combining_mark};
91pub use unread::new_filter as new_filter_unread;
92#[cfg(test)]
93use wiremock::{
94 Mock, MockServer, ResponseTemplate,
95 matchers::{header, method, path},
96};
97
98use super::RoomListItem;
99
100pub trait Filter: Fn(&RoomListItem) -> bool {}
104
105impl<F> Filter for F where F: Fn(&RoomListItem) -> bool {}
106
107#[cfg(not(target_family = "wasm"))]
109pub type BoxedFilterFn = Box<dyn Filter + Send + Sync>;
110#[cfg(target_family = "wasm")]
111pub type BoxedFilterFn = Box<dyn Filter>;
112
113fn normalize_string(str: &str) -> String {
117 str.nfd().filter(|c| !is_combining_mark(*c)).collect::<String>()
118}
119
120#[cfg(test)]
121pub(super) async fn new_rooms<const N: usize>(
122 room_ids: [&RoomId; N],
123 client: &Client,
124 server: &MockServer,
125) -> [RoomListItem; N] {
126 let mut response_builder = SyncResponseBuilder::default();
127
128 for room_id in room_ids {
129 response_builder.add_joined_room(JoinedRoomBuilder::new(room_id));
130 }
131
132 let json_response = response_builder.build_json_sync_response();
133
134 let _scope = Mock::given(method("GET"))
135 .and(path("/_matrix/client/r0/sync"))
136 .and(header("authorization", "Bearer 1234"))
137 .respond_with(ResponseTemplate::new(200).set_body_json(json_response))
138 .mount_as_scoped(server)
139 .await;
140
141 let _response = client.sync_once(Default::default()).await.unwrap();
142
143 room_ids.map(|room_id| client.get_room(room_id).unwrap().into())
144}
145
146#[cfg(test)]
147mod tests {
148 use super::normalize_string;
149
150 #[test]
151 fn test_normalize_string() {
152 assert_eq!(&normalize_string("abc"), "abc");
153 assert_eq!(&normalize_string("Ștefan Été"), "Stefan Ete");
154 assert_eq!(&normalize_string("Ç ṩ ḋ Å"), "C s d A");
155 assert_eq!(&normalize_string("هند"), "هند");
156 }
157}