use std::path::{Path, PathBuf};
use serde::{Deserialize, Serialize};
use crate::error::Result;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CacheEntry {
pub key: String,
pub description: String,
pub size_bytes: u64,
pub cached_at: i64,
pub last_accessed: i64,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct CacheStats {
pub entry_count: usize,
pub total_bytes: u64,
}
pub trait CacheBackend: Send + Sync {
fn get(&self, key: &str) -> Result<Option<PathBuf>>;
fn put(&self, key: &str, source_dir: &Path, description: &str) -> Result<PathBuf>;
fn invalidate(&self, key: &str) -> Result<()>;
fn prune(&self, max_entries: usize, max_bytes: u64) -> Result<usize>;
fn list(&self) -> Result<Vec<CacheEntry>>;
fn stats(&self) -> Result<CacheStats> {
let entries = self.list()?;
Ok(CacheStats {
entry_count: entries.len(),
total_bytes: entries.iter().map(|e| e.size_bytes).sum(),
})
}
}