use serde::{Deserialize, Serialize};
use std::collections::{HashMap, HashSet};
#[derive(Debug, Serialize, Deserialize, Clone, Default)]
pub struct ModelConfig {
#[serde(default)]
pub enable: Vec<String>,
#[serde(rename = "presets", default)]
pub presets: HashMap<String, Vec<String>>,
#[serde(skip)]
pub resolved_models: Vec<String>,
}
impl ModelConfig {
pub fn resolve(&mut self) {
let mut new_models = HashSet::new();
for entry in &self.enable {
if let Some(preset_name) = entry.strip_prefix("preset:") {
let (preset, filter) = preset_name.split_once('@').unwrap_or((preset_name, ""));
if let Some(models) = self.presets.get(preset) {
for model in models {
if filter.is_empty() || model.contains(filter) {
new_models.insert(model.to_string());
}
}
}
} else {
new_models.insert(entry.to_string());
}
}
self.resolved_models = new_models.into_iter().collect();
}
pub fn is_enabled(&self, model_id: &str) -> bool {
self.resolved_models.contains(&model_id.to_string())
}
}