/ src / profile / bookmark / memory.rs
memory.rs
 1  use super::Item;
 2  use itertools::Itertools;
 3  
 4  /// Reduce disk usage by cache Bookmarks index in memory
 5  pub struct Memory(Vec<Item>);
 6  
 7  impl Memory {
 8      // Constructors
 9  
10      /// Create new `Self`
11      pub fn new() -> Self {
12          Self(Vec::new())
13      }
14  
15      // Actions
16  
17      /// Add new item
18      pub fn add(&mut self, item: Item) {
19          self.0.push(item)
20      }
21  
22      /// Delete record from index by `request`
23      pub fn delete_by_request(&mut self, request: &str) -> Option<Item> {
24          for (i, item) in self.0.iter().enumerate() {
25              if item.request == request {
26                  return Some(self.0.remove(i));
27              }
28          }
29          None
30      }
31  
32      /// Check `request` exists in the memory index
33      pub fn is_match_request(&self, request: &str) -> bool {
34          for item in self.0.iter() {
35              if item.request == request {
36                  return true;
37              }
38          }
39          false
40      }
41  
42      /// Get unordered Items vector where title or request match `request`
43      /// * this function is case insensitive
44      pub fn contains_request(&self, request: &str, limit: Option<usize>) -> Vec<Item> {
45          self.0
46              .iter()
47              .filter(|item| {
48                  let p = request.to_lowercase();
49                  item.request.to_lowercase().contains(&p)
50                      || item
51                          .title
52                          .as_ref()
53                          .is_some_and(|t| t.to_lowercase().contains(&p))
54              })
55              .take(limit.unwrap_or(usize::MAX))
56              .cloned()
57              .collect()
58      }
59  
60      /// Get recent Items vector sorted by `ID` DESC
61      pub fn recent(&self, limit: Option<usize>) -> Vec<Item> {
62          self.0
63              .iter()
64              .sorted_by(|a, b| Ord::cmp(&b.id, &a.id))
65              .take(limit.unwrap_or(usize::MAX))
66              .cloned()
67              .collect()
68      }
69  }
70  
71  impl Default for Memory {
72      fn default() -> Self {
73          Self::new()
74      }
75  }