use std::path::PathBuf;
use crate::config::Profile;
use crate::config::builtin_profiles;
use crate::config::config_base_dir;
use crate::config::store::NamedStore;
pub fn profiles_config_dir() -> PathBuf {
config_base_dir().join("llm-manager").join("profiles")
}
pub fn unused_profiles_dir() -> PathBuf {
config_base_dir()
.join("llm-manager")
.join("unused_profiles")
}
#[derive(Debug, Clone)]
pub struct ProfileStore {
inner: NamedStore<Profile>,
}
impl ProfileStore {
pub fn new() -> Self {
let profiles_dir = profiles_config_dir();
let unused_dir = unused_profiles_dir();
Self {
inner: NamedStore::new(profiles_dir, unused_dir),
}
}
pub fn save(&mut self, profile: &Profile) {
self.inner.save(&profile.name, profile)
}
pub fn insert_builtin(&mut self, profile: Profile) {
self.inner.insert_builtin(profile.name.clone(), profile)
}
pub fn delete(&mut self, name: &str) -> bool {
let builtin = builtin_profiles();
let names: Vec<String> = builtin.iter().map(|b| b.name.clone()).collect();
self.inner.delete(name, &names)
}
pub fn get(&self, name: &str) -> Option<&Profile> {
self.inner.get(name)
}
pub fn user_profiles(&self) -> Vec<Profile> {
let builtin = builtin_profiles();
let names: Vec<String> = builtin.iter().map(|b| b.name.clone()).collect();
self.inner.user_items(&names)
}
pub fn all(&self) -> Vec<Profile> {
let builtin = builtin_profiles();
let names: Vec<String> = builtin.iter().map(|b| b.name.clone()).collect();
self.inner.all(builtin, &names)
}
}
impl Default for ProfileStore {
fn default() -> Self {
Self::new()
}
}