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 }