use crate::config::Config;
use crate::offence::Offence;
use crate::rule::Rule;
use crate::rules::header_rule::HeaderRule;
use crate::rules::readable_source_rule::ReadableSourceRule;
use crate::rules::test_file_structure_rule::TestFileStructureRule;
use crate::rules::test_free_source_rule::TestFreeSourceRule;
use crate::rules::tests_layout_rule::TestsLayoutRule;
use crate::source_file::SourceFile;
pub struct RuleRegistry {
rules: Vec<Box<dyn Rule>>,
}
impl RuleRegistry {
pub fn from_config(config: &Config) -> Self {
let mut rules: Vec<Box<dyn Rule>> = vec![
Box::new(ReadableSourceRule::new()),
Box::new(TestFileStructureRule::new()),
Box::new(TestFreeSourceRule::new()),
Box::new(TestsLayoutRule::new()),
];
if !config.expected_header.is_empty() {
rules.push(Box::new(HeaderRule::new(config.expected_header.clone())));
}
Self { rules }
}
pub fn new(rules: Vec<Box<dyn Rule>>) -> Self {
Self { rules }
}
pub fn is_empty(&self) -> bool {
self.rules.is_empty()
}
pub fn names(&self) -> Vec<&'static str> {
self.rules.iter().map(|rule| rule.name()).collect()
}
pub fn check(&self, file: &SourceFile) -> Vec<Offence> {
self.rules
.iter()
.flat_map(|rule| rule.check(file))
.collect()
}
pub fn check_workspace(&self, files: &[SourceFile]) -> Vec<Offence> {
self.rules
.iter()
.flat_map(|rule| rule.check_workspace(files))
.collect()
}
}