main-spex 0.21.0

AI-first development framework that turns specifications into deterministic, verifiable code
use globset::Glob;

use crate::rule::Check;

use super::super::finding::Location;
use super::super::scoped_file::ScopedFile;
use super::{Outcome, Wording, presence_hits};

#[cfg(test)]
#[path = "glob_test.rs"]
mod glob_test;

pub(in crate::commands::check) fn run_glob(
    check: &Check,
    pattern: &str,
    negate: bool,
    files: &[&ScopedFile],
) -> Outcome {
    let matcher = Glob::new(pattern)
        .map_err(|err| format!("invalid glob: {err}"))?
        .compile_matcher();

    let found = files
        .iter()
        .filter(|file| matcher.is_match(&file.rel))
        .map(|file| Location::in_file(&file.rel))
        .collect();
    let required = format!("required path not found: {pattern}");
    let wording = Wording {
        forbidden: "forbidden path",
        required: &required,
    };
    Ok(presence_hits(check, negate, found, None, &wording))
}