codeowners_validation/validators/
validator.rs1use 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}