mod go_extractor;
mod java_extractor;
mod rust_extractor;
mod scala_extractor;
mod typescript_extractor;
mod python_extractor;
mod c_extractor;
mod cpp_extractor;
mod kotlin_extractor;
mod dart_extractor;
mod csharp_extractor;
mod pascal_extractor;
pub use go_extractor::GoExtractor;
pub use java_extractor::JavaExtractor;
pub use rust_extractor::RustExtractor;
pub use scala_extractor::ScalaExtractor;
pub use typescript_extractor::TypeScriptExtractor;
pub use python_extractor::PythonExtractor;
pub use c_extractor::CExtractor;
pub use cpp_extractor::CppExtractor;
pub use kotlin_extractor::KotlinExtractor;
pub use dart_extractor::DartExtractor;
pub use csharp_extractor::CSharpExtractor;
pub use pascal_extractor::PascalExtractor;
use crate::types::ExtractionResult;
pub trait LanguageExtractor: Send + Sync {
fn extensions(&self) -> &[&str];
fn language_name(&self) -> &str;
fn extract(&self, file_path: &str, source: &str) -> ExtractionResult;
}
pub struct LanguageRegistry {
extractors: Vec<Box<dyn LanguageExtractor>>,
}
impl LanguageRegistry {
pub fn new() -> Self {
Self {
extractors: vec![
Box::new(RustExtractor),
Box::new(GoExtractor),
Box::new(JavaExtractor),
Box::new(ScalaExtractor),
Box::new(TypeScriptExtractor),
Box::new(PythonExtractor),
Box::new(CExtractor),
Box::new(CppExtractor),
Box::new(CSharpExtractor),
Box::new(DartExtractor),
Box::new(KotlinExtractor),
Box::new(PascalExtractor),
],
}
}
pub fn extractor_for_file(&self, path: &str) -> Option<&dyn LanguageExtractor> {
let ext = path.rsplit('.').next()?;
self.extractors
.iter()
.find(|e| e.extensions().contains(&ext))
.map(|e| e.as_ref())
}
pub fn supported_extensions(&self) -> Vec<&str> {
self.extractors
.iter()
.flat_map(|e| e.extensions().iter().copied())
.collect()
}
}
impl Default for LanguageRegistry {
fn default() -> Self {
Self::new()
}
}