use super::{BatViewer, GlowViewer, HtmlViewer, TmuxNvimViewer, ViewerBackend};
pub struct ViewerRegistry {
viewers: Vec<Box<dyn ViewerBackend>>,
tmux_enabled: bool,
}
impl ViewerRegistry {
pub fn new(viewers: Vec<Box<dyn ViewerBackend>>) -> Self {
Self {
viewers,
tmux_enabled: true,
}
}
pub fn with_tmux_enabled(viewers: Vec<Box<dyn ViewerBackend>>, tmux_enabled: bool) -> Self {
Self {
viewers,
tmux_enabled,
}
}
pub fn for_proposals(tmux_enabled: bool) -> Self {
Self::with_tmux_enabled(
vec![
Box::new(TmuxNvimViewer),
Box::new(BatViewer),
Box::new(GlowViewer),
Box::new(HtmlViewer),
],
tmux_enabled,
)
}
pub fn is_enabled(&self, name: &str) -> bool {
self.tmux_enabled || name != "tmux-nvim"
}
pub fn available_viewers(&self) -> Vec<&dyn ViewerBackend> {
let mut available = Vec::new();
for viewer in &self.viewers {
let viewer = viewer.as_ref();
if self.is_enabled(viewer.name()) && 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
}
}