use super::types::{CacheEntry, CacheMetrics};
use std::collections::{HashMap, VecDeque};
use uuid::Uuid;
pub(crate) struct CacheState {
pub entries: HashMap<Uuid, CacheEntry>,
pub lru_queue: VecDeque<Uuid>,
pub metrics: CacheMetrics,
}
impl CacheState {
pub fn new() -> Self {
Self {
entries: HashMap::new(),
lru_queue: VecDeque::new(),
metrics: CacheMetrics::default(),
}
}
pub fn update_metrics(&mut self) {
self.metrics.item_count = self.entries.len();
self.metrics.total_size_bytes = self.entries.values().map(|e| e.size_bytes).sum();
self.metrics.calculate_hit_rate();
}
pub fn remove_entry(&mut self, id: &Uuid) -> Option<CacheEntry> {
if let Some(entry) = self.entries.remove(id) {
self.lru_queue.retain(|&qid| qid != *id);
Some(entry)
} else {
None
}
}
pub fn clear(&mut self) {
self.entries.clear();
self.lru_queue.clear();
self.metrics = CacheMetrics::default();
}
}
impl Default for CacheState {
fn default() -> Self {
Self::new()
}
}