use crate::presets::preset::Preset;
use anyhow::Result;
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct PresetCollection {
pub version: String,
#[serde(default)]
pub presets: std::collections::HashMap<String, Preset>,
}
pub struct PresetStore {
config_dir: std::path::PathBuf,
presets_file: std::path::PathBuf,
}
impl PresetStore {
pub fn new() -> Result<Self> {
let config_dir = dirs::home_dir()
.map(|p| p.join(".agentswitch"))
.ok_or_else(|| anyhow::anyhow!("无法获取主目录"))?;
std::fs::create_dir_all(&config_dir)?;
let presets_file = config_dir.join("presets.toml");
Ok(Self {
config_dir,
presets_file,
})
}
pub fn load(&self) -> Result<PresetCollection> {
if !self.presets_file.exists() {
return Ok(PresetCollection {
version: "1.0.0".to_string(),
presets: std::collections::HashMap::new(),
});
}
let content = std::fs::read_to_string(&self.presets_file)?;
let collection: PresetCollection = toml::from_str(&content)?;
Ok(collection)
}
pub fn save(&self, collection: &PresetCollection) -> Result<()> {
let tmp_file = self.presets_file.with_extension("tmp.toml");
let content = toml::to_string_pretty(collection)?;
std::fs::write(&tmp_file, content)?;
if cfg!(not(windows)) {
std::fs::rename(&tmp_file, &self.presets_file)?;
} else {
if self.presets_file.exists() {
std::fs::remove_file(&self.presets_file)?;
}
std::fs::rename(&tmp_file, &self.presets_file)?;
}
Ok(())
}
pub fn add_preset(&mut self, preset: Preset) -> Result<()> {
let mut collection = self.load()?;
if collection.presets.contains_key(&preset.name) {
anyhow::bail!("预设名称已存在: {}", preset.name);
}
collection.presets.insert(preset.name.clone(), preset);
self.save(&collection)?;
Ok(())
}
pub fn get_preset(&self, name: &str) -> Result<Preset> {
let collection = self.load()?;
collection
.presets
.get(name)
.cloned()
.ok_or_else(|| anyhow::anyhow!("预设不存在: {}", name))
}
pub fn list_presets(&self) -> Result<Vec<Preset>> {
let collection = self.load()?;
let mut presets: Vec<_> = collection.presets.values().cloned().collect();
presets.sort_by(|a, b| a.name.cmp(&b.name));
Ok(presets)
}
pub fn update_preset(&mut self, preset: Preset) -> Result<()> {
let mut collection = self.load()?;
if !collection.presets.contains_key(&preset.name) {
anyhow::bail!("预设不存在: {}", preset.name);
}
collection.presets.insert(preset.name.clone(), preset);
self.save(&collection)?;
Ok(())
}
pub fn remove_preset(&mut self, name: &str) -> Result<()> {
let mut collection = self.load()?;
if collection.presets.remove(name).is_none() {
anyhow::bail!("预设不存在: {}", name);
}
self.save(&collection)?;
Ok(())
}
pub fn find_by_tag(&self, tag: &str) -> Result<Vec<Preset>> {
let collection = self.load()?;
let presets: Vec<_> = collection
.presets
.values()
.filter(|p| p.tags.contains(&tag.to_string()))
.cloned()
.collect();
Ok(presets)
}
}