Skip to main content

ito_core/viewer/
registry.rs

1use super::{BatViewer, GlowViewer, HtmlViewer, ViewerBackend};
2
3/// Registry of known proposal viewer backends.
4pub struct ViewerRegistry {
5    viewers: Vec<Box<dyn ViewerBackend>>,
6}
7
8impl ViewerRegistry {
9    /// Create a registry from a fixed set of backends.
10    pub fn new(viewers: Vec<Box<dyn ViewerBackend>>) -> Self {
11        Self { viewers }
12    }
13
14    /// Create the default proposal viewer registry.
15    pub fn for_proposals() -> Self {
16        Self::new(vec![
17            Box::new(BatViewer),
18            Box::new(GlowViewer),
19            Box::new(HtmlViewer),
20        ])
21    }
22
23    /// Return viewers that are currently runnable.
24    pub fn available_viewers(&self) -> Vec<&dyn ViewerBackend> {
25        let mut available = Vec::new();
26        for viewer in &self.viewers {
27            let viewer = viewer.as_ref();
28            if viewer.is_available() {
29                available.push(viewer);
30            }
31        }
32        available
33    }
34
35    /// Find a registered viewer by its stable name.
36    pub fn find_by_name(&self, name: &str) -> Option<&dyn ViewerBackend> {
37        for viewer in &self.viewers {
38            let viewer = viewer.as_ref();
39            if viewer.name() == name {
40                return Some(viewer);
41            }
42        }
43        None
44    }
45}