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