matrix_sdk_ui/room_list_service/filters/
category.rs1use super::{super::Room, Filter};
16
17#[derive(Copy, Clone, PartialEq)]
28pub enum RoomCategory {
29 Group,
30 People,
31}
32
33type DirectTargetsLength = usize;
34
35struct CategoryRoomMatcher<F>
36where
37 F: Fn(&Room) -> Option<DirectTargetsLength>,
38{
39 number_of_direct_targets: F,
42}
43
44impl<F> CategoryRoomMatcher<F>
45where
46 F: Fn(&Room) -> Option<DirectTargetsLength>,
47{
48 fn matches(&self, room: &Room, expected_kind: RoomCategory) -> bool {
49 let kind = match (self.number_of_direct_targets)(room) {
50 Some(1) => RoomCategory::People,
53
54 Some(_) => RoomCategory::Group,
58
59 None => return false,
61 };
62
63 kind == expected_kind
64 }
65}
66
67pub fn new_filter(expected_category: RoomCategory) -> impl Filter {
71 let matcher = CategoryRoomMatcher {
72 number_of_direct_targets: move |room| Some(room.direct_targets_length()),
73 };
74
75 move |room| -> bool { matcher.matches(room, expected_category) }
76}
77
78#[cfg(test)]
79mod tests {
80 use std::ops::Not;
81
82 use matrix_sdk::test_utils::logged_in_client_with_server;
83 use matrix_sdk_test::async_test;
84 use ruma::room_id;
85
86 use super::{super::new_rooms, *};
87
88 #[async_test]
89 async fn test_kind_is_group() {
90 let (client, server) = logged_in_client_with_server().await;
91 let [room] = new_rooms([room_id!("!a:b.c")], &client, &server).await;
92
93 let matcher = CategoryRoomMatcher { number_of_direct_targets: |_| Some(42) };
94
95 {
97 let expected_kind = RoomCategory::People;
98
99 assert!(matcher.matches(&room, expected_kind).not());
100 }
101
102 {
104 let expected_kind = RoomCategory::Group;
105
106 assert!(matcher.matches(&room, expected_kind));
107 }
108 }
109
110 #[async_test]
111 async fn test_kind_is_people() {
112 let (client, server) = logged_in_client_with_server().await;
113 let [room] = new_rooms([room_id!("!a:b.c")], &client, &server).await;
114
115 let matcher = CategoryRoomMatcher { number_of_direct_targets: |_| Some(1) };
116
117 {
119 let expected_kind = RoomCategory::People;
120
121 assert!(matcher.matches(&room, expected_kind));
122 }
123
124 {
126 let expected_kind = RoomCategory::Group;
127
128 assert!(matcher.matches(&room, expected_kind).not());
129 }
130 }
131
132 #[async_test]
133 async fn test_room_kind_cannot_be_found() {
134 let (client, server) = logged_in_client_with_server().await;
135 let [room] = new_rooms([room_id!("!a:b.c")], &client, &server).await;
136
137 let matcher = CategoryRoomMatcher { number_of_direct_targets: |_| None };
138
139 assert!(matcher.matches(&room, RoomCategory::Group).not());
140 }
141}