codeowners-rs 0.1.1

A library for parsing and matching CODEOWNERS files
Documentation
use codeowners_rs::{Rule, RuleSet};
use criterion::{criterion_group, criterion_main, Criterion};

const TEST_PATHS: &[&str] = &[
    "file-a",
    "dir-a/file-a",
    "dir-a/dir-c/file-a",
    "dir-a/dir-c/file-b",
    "dir-b/file-a",
    "dir-b/dir-d/dir-e/dir-f/dir-g/file-a",
];

const TEST_PATTERNS: &[&str] = &[
    "*",
    "*-a",
    "file-*",
    "/dir-b",
    "dir-a/dir-b",
    "**/dir-*/file-*",
    "dir-*/*",
    "dir-b/dir-d/dir-e/dir-f/dir-g/file-a",
];

fn build_patternset(patterns: &[&str]) -> RuleSet {
    let rules = patterns
        .iter()
        .map(|&pattern| Rule {
            pattern: pattern.to_string(),
            owners: vec![],
        })
        .collect();

    RuleSet::new(rules)
}

fn patternset_benchmark(c: &mut Criterion) {
    c.bench_function("building", |b| b.iter(|| build_patternset(TEST_PATTERNS)));

    let patternset = build_patternset(TEST_PATTERNS);
    c.bench_function("matching", |b| {
        b.iter(|| {
            for p in TEST_PATHS {
                patternset.all_matching_rules(p);
            }
        })
    });
}

criterion_group!(benches, patternset_benchmark);
criterion_main!(benches);