codeowners_validation/validators/
validator.rs

1use crate::parser::CodeOwnerRule;
2use crate::validators::duplicate_patterns::validate_duplicates;
3use crate::validators::exists::validate_directory;
4use std::path::Path;
5use std::time;
6
7#[derive(Debug, Clone, Default)]
8pub struct ValidatorArgs {
9    pub exists: bool,
10    pub duplicate_patterns: bool,
11}
12
13impl ValidatorArgs {
14    pub fn from_env(args_str: &str) -> Self {
15        let mut args = ValidatorArgs::default();
16
17        for arg in args_str.split(',') {
18            match arg.trim() {
19                "exists" => args.exists = true,
20                "duplicate_patterns" => args.duplicate_patterns = true,
21                _ => (),
22            }
23        }
24
25        args
26    }
27
28    pub fn should_run_all(&self) -> bool {
29        !self.exists && !self.duplicate_patterns
30    }
31}
32
33pub fn run_validator(
34    args: &ValidatorArgs,
35    rules: &[CodeOwnerRule],
36) -> Vec<(String, CodeOwnerRule)> {
37    let mut failed_rules = Vec::new();
38
39    let validators: Vec<(&str, fn(&[CodeOwnerRule]) -> Vec<CodeOwnerRule>)> = vec![
40        ("exists", |rules| {
41            let repo_dir = Path::new(".");
42            validate_directory(repo_dir, rules).unwrap_or_default()
43        }),
44        ("duplicate_patterns", validate_duplicates),
45    ];
46
47    for (name, validator_fn) in validators {
48        if args.should_run_all()
49            || (name == "exists" && args.exists)
50            || (name == "duplicate_patterns" && args.duplicate_patterns)
51        {
52            let now = time::Instant::now();
53            for rule in validator_fn(rules) {
54                failed_rules.push((name.to_string(), rule));
55            }
56            println!("{} validation run in {:?}", name, now.elapsed());
57        }
58    }
59
60    failed_rules
61}