use std::collections::HashMap;
use std::sync::Mutex;
use crate::canonical::{CachedModels, Model};
use crate::store::ModelCache;
#[derive(Default)]
pub struct MemoryModelCache {
entries: Mutex<HashMap<String, CachedModels>>,
puts: Mutex<Vec<(String, CachedModels)>>,
}
impl MemoryModelCache {
pub fn new() -> Self {
MemoryModelCache::default()
}
pub fn with(provider: &str, models: Vec<Model>) -> Self {
MemoryModelCache::new().and(provider, models)
}
pub fn and(self, provider: &str, models: Vec<Model>) -> Self {
if let Ok(mut entries) = self.entries.lock() {
entries.insert(
provider.to_owned(),
CachedModels {
models,
last_used: None,
},
);
}
self
}
pub fn last_used(self, provider: &str, id: &str) -> Self {
if let Ok(mut entries) = self.entries.lock() {
entries.entry(provider.to_owned()).or_default().last_used = Some(id.to_owned());
}
self
}
pub fn puts(&self) -> Vec<(String, CachedModels)> {
self.puts.lock().ok().map(|p| p.clone()).unwrap_or_default()
}
}
impl ModelCache for MemoryModelCache {
fn get(&self, provider: &str) -> Option<CachedModels> {
self.entries.lock().ok()?.get(provider).cloned()
}
fn put(&self, provider: &str, cached: &CachedModels) {
if let Ok(mut entries) = self.entries.lock() {
entries.insert(provider.to_owned(), cached.clone());
}
if let Ok(mut puts) = self.puts.lock() {
puts.push((provider.to_owned(), cached.clone()));
}
}
}