git_rune/utils/
filters.rs1use 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}