use crate::core::Symbol;
pub mod go;
pub mod python;
pub mod ruby;
pub mod rust;
pub trait LanguagePlugin {
fn language(&self) -> &'static str;
fn extensions(&self) -> &[&str];
fn extract(&self, file: &str, source: &str) -> Vec<Symbol>;
}
pub fn languages() -> Vec<&'static str> {
registry().iter().map(|p| p.language()).collect()
}
pub fn registry() -> Vec<Box<dyn LanguagePlugin>> {
vec![
Box::new(ruby::Ruby),
Box::new(rust::Rust),
Box::new(go::Go),
Box::new(python::Python),
]
}
pub fn plugin_for_extension(ext: &str) -> Option<Box<dyn LanguagePlugin>> {
registry()
.into_iter()
.find(|p| p.extensions().contains(&ext))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn languages_are_registered_by_extension() {
for ext in ["rb", "rs", "go", "py"] {
assert!(plugin_for_extension(ext).is_some(), "{ext} should resolve");
}
assert!(plugin_for_extension("java").is_none());
}
}