use std::collections::HashMap;
use std::path::PathBuf;
use super::processor::AnnotationProcessor;
pub struct ProcessorRegistry {
processors: HashMap<String, AnnotationProcessor>,
}
impl ProcessorRegistry {
pub fn new() -> Self {
Self {
processors: HashMap::new(),
}
}
pub fn register(&mut self, processor: AnnotationProcessor) {
self.processors.insert(processor.name.clone(), processor);
}
pub fn get(&self, name: &str) -> Option<&AnnotationProcessor> {
self.processors.get(name)
}
pub fn all(&self) -> Vec<&AnnotationProcessor> {
self.processors.values().collect()
}
pub fn discover_from_classpath(&mut self, _classpath: &[PathBuf]) {
for processor in super::processor::common::common_processors() {
self.register(processor);
}
}
pub fn find_for_annotations(&self, annotations: &[String]) -> Vec<&AnnotationProcessor> {
self.processors
.values()
.filter(|p| {
annotations
.iter()
.any(|a| p.supported_annotations.contains(a))
})
.collect()
}
}
impl Default for ProcessorRegistry {
fn default() -> Self {
let mut registry = Self::new();
for processor in super::processor::common::common_processors() {
registry.register(processor);
}
registry
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_processor_registry() {
let mut registry = ProcessorRegistry::new();
let processor = AnnotationProcessor::new("test.Processor");
registry.register(processor);
assert!(registry.get("test.Processor").is_some());
assert_eq!(registry.all().len(), 1);
}
}