git_rune/utils/
filters.rs

1use anyhow::Result;
2use glob::Pattern;
3
4#[derive(Default)]
5pub struct GlobFilters {
6    include_patterns: Vec<Pattern>,
7    ignore_patterns: Vec<Pattern>,
8}
9
10impl GlobFilters {
11    pub fn new(include_patterns: Option<&str>, ignore_patterns: Option<&str>) -> Result<Self> {
12        let include_patterns = if let Some(patterns) = include_patterns {
13            patterns
14                .split(',')
15                .filter(|p| !p.trim().is_empty())
16                .map(|p| Pattern::new(p.trim()))
17                .collect::<std::result::Result<Vec<_>, _>>()?
18        } else {
19            vec![Pattern::new("**/*")?]
20        };
21
22        let ignore_patterns = if let Some(patterns) = ignore_patterns {
23            patterns
24                .split(',')
25                .filter(|p| !p.trim().is_empty())
26                .map(|p| Pattern::new(p.trim()))
27                .collect::<std::result::Result<Vec<_>, _>>()?
28        } else {
29            Vec::new()
30        };
31
32        Ok(Self {
33            include_patterns,
34            ignore_patterns,
35        })
36    }
37
38    pub fn should_include(&self, path: &str) -> bool {
39        let matches_include = self
40            .include_patterns
41            .iter()
42            .any(|pattern| pattern.matches(path));
43
44        let matches_ignore = self
45            .ignore_patterns
46            .iter()
47            .any(|pattern| pattern.matches(path));
48
49        matches_include && !matches_ignore
50    }
51}