use std::path::{Path, PathBuf};
use super::discovery::discover_captures;
use super::lua_loader::load_capture_from_lua;
use super::types::{CaptureDiscoveryError, CaptureInfo, CaptureRepoError, LoadedCapture};
pub struct CaptureRepository {
pub root: PathBuf,
pub captures: Vec<CaptureInfo>,
}
impl CaptureRepository {
pub fn new(root: &Path) -> Result<Self, CaptureDiscoveryError> {
let captures = discover_captures(root)?;
Ok(Self { root: root.to_path_buf(), captures })
}
pub fn list_all(&self) -> &[CaptureInfo] {
&self.captures
}
pub fn get_by_name(&self, name: &str) -> Result<LoadedCapture, CaptureRepoError> {
let info = self
.captures
.iter()
.find(|c| c.logical_name == name)
.ok_or_else(|| CaptureRepoError::NotFound(name.to_string()))?;
let spec = load_capture_from_lua(&info.path)?;
Ok(LoadedCapture {
logical_name: info.logical_name.clone(),
path: info.path.clone(),
spec,
})
}
}