use crate::agents::AgentAdapter;
use crate::config::ModelConfig;
use crate::presets::preset::Preset;
use anyhow::Result;
pub struct PresetAppplier {
adapters: Vec<Box<dyn AgentAdapter>>,
}
impl PresetAppplier {
pub fn new(adapters: Vec<Box<dyn AgentAdapter>>) -> Self {
Self { adapters }
}
pub fn apply(
&self,
preset: &Preset,
model_configs: &std::collections::HashMap<String, ModelConfig>,
) -> Result<()> {
self.validate_before_apply(preset, model_configs)?;
self.backup_before_apply()?;
for (agent_name, model_name) in &preset.mappings {
let model_config = model_configs
.get(model_name)
.ok_or_else(|| anyhow::anyhow!("模型配置不存在: {}", model_name))?;
let adapter = self
.adapters
.iter()
.find(|a| a.name() == agent_name.as_str())
.ok_or_else(|| anyhow::anyhow!("工具未注册: {}", agent_name))?;
adapter
.apply(model_config)
.map_err(|e| anyhow::anyhow!("应用失败: 工具={}, 原因={}", agent_name, e))?;
}
Ok(())
}
pub fn apply_to_agents(
&self,
preset: &Preset,
model_configs: &std::collections::HashMap<String, ModelConfig>,
agent_names: &[String],
) -> Result<()> {
self.validate_before_apply(preset, model_configs)?;
self.backup_before_apply()?;
for agent_name in agent_names {
let model_name = preset
.mappings
.get(agent_name)
.ok_or_else(|| anyhow::anyhow!("预设中未找到工具: {}", agent_name))?;
let model_config = model_configs
.get(model_name)
.ok_or_else(|| anyhow::anyhow!("模型配置不存在: {}", model_name))?;
let adapter = self
.adapters
.iter()
.find(|a| a.name() == agent_name.as_str())
.ok_or_else(|| anyhow::anyhow!("工具未注册: {}", agent_name))?;
adapter
.apply(model_config)
.map_err(|e| anyhow::anyhow!("应用失败: 工具={}, 原因={}", agent_name, e))?;
}
Ok(())
}
fn backup_before_apply(&self) -> Result<()> {
for adapter in &self.adapters {
adapter
.backup()
.map_err(|e| anyhow::anyhow!("备份失败: {}", e))?;
}
Ok(())
}
fn validate_before_apply(
&self,
preset: &Preset,
model_configs: &std::collections::HashMap<String, ModelConfig>,
) -> Result<()> {
for model_name in preset.mappings.values() {
if !model_configs.contains_key(model_name) {
anyhow::bail!("模型配置不存在: {}", model_name);
}
}
for agent_name in preset.mappings.keys() {
if !self
.adapters
.iter()
.any(|a| a.name() == agent_name.as_str())
{
anyhow::bail!("工具未注册: {}", agent_name);
}
}
Ok(())
}
}