use std::collections::HashMap;
use std::path::Path;
use super::profile::PersonaProfile;
use crate::error::{EvalError, Result};
pub struct PersonaRegistry {
personas: HashMap<String, PersonaProfile>,
}
impl PersonaRegistry {
pub fn new() -> Self {
Self { personas: HashMap::new() }
}
pub fn load_directory(dir: &Path) -> Result<Self> {
let mut personas = HashMap::new();
let entries = std::fs::read_dir(dir).map_err(|e| {
EvalError::LoadError(format!("failed to read persona directory {}: {e}", dir.display()))
})?;
for entry in entries {
let entry = entry.map_err(|e| {
EvalError::LoadError(format!("failed to read directory entry: {e}"))
})?;
let path = entry.path();
if path.extension().and_then(|ext| ext.to_str()) != Some("json") {
continue;
}
let contents = std::fs::read_to_string(&path).map_err(|e| {
EvalError::LoadError(format!("failed to read {}: {e}", path.display()))
})?;
let profile: PersonaProfile = serde_json::from_str(&contents).map_err(|e| {
EvalError::ParseError(format!("failed to parse {}: {e}", path.display()))
})?;
personas.insert(profile.name.clone(), profile);
}
Ok(Self { personas })
}
pub fn get(&self, name: &str) -> Option<&PersonaProfile> {
self.personas.get(name)
}
pub fn list(&self) -> Vec<&PersonaProfile> {
self.personas.values().collect()
}
pub fn register(&mut self, profile: PersonaProfile) {
self.personas.insert(profile.name.clone(), profile);
}
}
impl Default for PersonaRegistry {
fn default() -> Self {
Self::new()
}
}