use super::*;
pub struct PluginRegistry {
plugins: Vec<Box<dyn LanguagePlugin>>,
}
impl PluginRegistry {
pub fn new() -> Self {
Self {
plugins: vec![
Box::new(RustPlugin),
Box::new(PythonPlugin),
Box::new(JsPlugin),
],
}
}
pub fn empty() -> Self {
Self {
plugins: Vec::new(),
}
}
pub fn register(&mut self, plugin: Box<dyn LanguagePlugin>) {
self.plugins.push(plugin);
}
pub fn detect(&self, path: &Path) -> Option<&dyn LanguagePlugin> {
self.plugins
.iter()
.find(|p| p.detect(path))
.map(|p| p.as_ref())
}
pub fn detect_all(&self, path: &Path) -> Vec<&dyn LanguagePlugin> {
self.plugins
.iter()
.filter(|p| p.detect(path))
.map(|p| p.as_ref())
.collect()
}
pub fn get(&self, name: &str) -> Option<&dyn LanguagePlugin> {
self.plugins
.iter()
.find(|p| p.name() == name)
.map(|p| p.as_ref())
}
pub fn all(&self) -> &[Box<dyn LanguagePlugin>] {
&self.plugins
}
}
impl Default for PluginRegistry {
fn default() -> Self {
Self::new()
}
}