1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
use crate::types::User;
use std::{clone::Clone, sync::Arc};
/// Cached array of users
#[derive(Debug, Default)]
pub(crate) struct UserCache {
users: Vec<Arc<User>>,
}
impl UserCache {
pub fn replace_all(&mut self, users: Vec<Arc<User>>) {
self.users = users
}
/// Returns true if the cache is empty
pub fn is_empty(&self) -> bool {
self.users.is_empty()
}
/// Returns list of workspace users.
/// For searching for a user based on a boolean predicate,
/// find_user is more efficient, because it doesn't allocate a new vector.
pub fn users(&self) -> Vec<Arc<User>> {
self.users.clone()
}
/// Find first user matching predicate
pub fn find_user<P>(&self, predicate: P) -> Option<Arc<User>>
where
P: Fn(&Arc<User>) -> bool,
{
for u in self.users.iter() {
if (predicate)(u) {
return Some(u.clone());
}
}
None
}
/*
/// Finds user_id. Parameter may be display name, full name, uuid, or id
/// Name search is case-insensitive.
/// Reurns None if not found
pub async fn get_user_id(&'_ self, user: &str) -> Option<ID> {
if let Ok(id) = user.parse::<u64>() {
return Some(id);
}
let lc_name = user.to_lowercase();
self.find_user(|u| {
u.display_name.to_lowercase() == lc_name
|| u.full_name.to_lowercase() == lc_name
|| u.uuid == lc_name
})
.map(|u| u.id)
}
*/
}