use std::collections::HashMap;
use std::sync::{Arc, RwLock};
use std::time::{Duration, Instant};
struct CacheEntry {
data: Arc<Vec<u8>>,
inserted_at: Instant,
}
pub struct ContentCache {
entries: RwLock<HashMap<String, CacheEntry>>,
ttl: Duration,
}
impl ContentCache {
pub fn new(ttl: Duration) -> Self {
Self {
entries: RwLock::new(HashMap::new()),
ttl,
}
}
pub fn get(&self, key: &str) -> Option<Arc<Vec<u8>>> {
let entries = self.entries.read().ok()?;
let entry = entries.get(key)?;
if entry.inserted_at.elapsed() < self.ttl {
Some(entry.data.clone()) } else {
None }
}
pub fn insert(&self, key: String, data: Vec<u8>) {
if let Ok(mut entries) = self.entries.write() {
entries.insert(
key,
CacheEntry {
data: Arc::new(data),
inserted_at: Instant::now(),
},
);
}
}
pub fn invalidate(&self, key: &str) {
if let Ok(mut entries) = self.entries.write() {
entries.remove(key);
}
}
pub fn clear(&self) {
if let Ok(mut entries) = self.entries.write() {
entries.clear();
}
}
pub fn evict_expired(&self) {
if let Ok(mut entries) = self.entries.write() {
entries.retain(|_, entry| entry.inserted_at.elapsed() < self.ttl);
}
}
}