use crate::{ProviderDef, config::system::TasksConfig};
use anyhow::Result;
use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct DaemonConfig {
#[serde(default)]
pub provider: BTreeMap<String, ProviderDef>,
#[serde(default)]
pub tasks: TasksConfig,
#[serde(default)]
pub env: BTreeMap<String, String>,
}
impl DaemonConfig {
pub fn from_toml(toml_str: &str) -> Result<Self> {
let config: Self = toml::from_str(toml_str)?;
validate_providers(&config.provider)?;
Ok(config)
}
pub fn load(path: &std::path::Path) -> Result<Self> {
let content = std::fs::read_to_string(path)?;
Self::from_toml(&content)
}
}
pub fn validate_providers(providers: &BTreeMap<String, ProviderDef>) -> Result<()> {
let mut seen = std::collections::HashSet::new();
for (name, def) in providers {
def.validate(name).map_err(|e| anyhow::anyhow!(e))?;
for model in &def.models {
if !seen.insert(model.clone()) {
anyhow::bail!("duplicate model name '{model}' across providers");
}
}
}
Ok(())
}