1use glob::Pattern;
2
3#[derive(Debug, Clone, Default)]
5pub struct Filter {
6 pub include_patterns: Vec<Pattern>,
8 pub exclude_patterns: Vec<Pattern>,
10 pub ignore_case: bool,
12}
13
14impl Filter {
15 pub fn new() -> Self {
16 Self::default()
17 }
18
19 pub fn add_include(&mut self, pattern: &str) -> Result<(), glob::PatternError> {
21 let pattern_str = if self.ignore_case {
22 pattern.to_lowercase()
23 } else {
24 pattern.to_string()
25 };
26 self.include_patterns.push(Pattern::new(&pattern_str)?);
27 Ok(())
28 }
29
30 pub fn add_exclude(&mut self, pattern: &str) -> Result<(), glob::PatternError> {
32 let pattern_str = if self.ignore_case {
33 pattern.to_lowercase()
34 } else {
35 pattern.to_string()
36 };
37 self.exclude_patterns.push(Pattern::new(&pattern_str)?);
38 Ok(())
39 }
40
41 pub fn matches(&self, name: &str, _is_dir: bool) -> bool {
43 let match_name = if self.ignore_case {
44 name.to_lowercase()
45 } else {
46 name.to_string()
47 };
48
49 for pattern in &self.exclude_patterns {
51 if pattern.matches(&match_name) {
52 return false;
53 }
54 }
55
56 if !self.include_patterns.is_empty() {
58 for pattern in &self.include_patterns {
59 if pattern.matches(&match_name) {
60 return true;
61 }
62 }
63 return false;
64 }
65
66 true
67 }
68}