use super::Item;
use itertools::Itertools;
pub struct Memory(Vec<Item>);
impl Memory {
pub fn new() -> Self {
Self(Vec::new())
}
pub fn add(&mut self, item: Item) {
self.0.push(item)
}
pub fn delete_by_request(&mut self, request: &str) -> Option<Item> {
for (i, item) in self.0.iter().enumerate() {
if item.request == request {
return Some(self.0.remove(i));
}
}
None
}
pub fn is_match_request(&self, request: &str) -> bool {
for item in self.0.iter() {
if item.request == request {
return true;
}
}
false
}
pub fn contains_request(&self, request: &str, limit: Option<usize>) -> Vec<Item> {
self.0
.iter()
.filter(|item| {
let p = request.to_lowercase();
item.request.to_lowercase().contains(&p)
|| item
.title
.as_ref()
.is_some_and(|t| t.to_lowercase().contains(&p))
})
.take(limit.unwrap_or(usize::MAX))
.cloned()
.collect()
}
pub fn recent(&self, limit: Option<usize>) -> Vec<Item> {
self.0
.iter()
.sorted_by(|a, b| Ord::cmp(&b.id, &a.id))
.take(limit.unwrap_or(usize::MAX))
.cloned()
.collect()
}
}
impl Default for Memory {
fn default() -> Self {
Self::new()
}
}