use super::{BatViewer, GlowViewer, HtmlViewer, ViewerBackend};
pub struct ViewerRegistry {
viewers: Vec<Box<dyn ViewerBackend>>,
}
impl ViewerRegistry {
pub fn new(viewers: Vec<Box<dyn ViewerBackend>>) -> Self {
Self { viewers }
}
pub fn for_proposals() -> Self {
Self::new(vec![
Box::new(BatViewer),
Box::new(GlowViewer),
Box::new(HtmlViewer),
])
}
pub fn available_viewers(&self) -> Vec<&dyn ViewerBackend> {
let mut available = Vec::new();
for viewer in &self.viewers {
let viewer = viewer.as_ref();
if viewer.is_available() {
available.push(viewer);
}
}
available
}
pub fn find_by_name(&self, name: &str) -> Option<&dyn ViewerBackend> {
for viewer in &self.viewers {
let viewer = viewer.as_ref();
if viewer.name() == name {
return Some(viewer);
}
}
None
}
}