tree_rust/
filter.rs

1use glob::Pattern;
2
3/// Filter configuration for file matching
4#[derive(Debug, Clone, Default)]
5pub struct Filter {
6    /// Patterns to include (empty means include all)
7    pub include_patterns: Vec<Pattern>,
8    /// Patterns to exclude
9    pub exclude_patterns: Vec<Pattern>,
10    /// Whether pattern matching is case-insensitive
11    pub ignore_case: bool,
12}
13
14impl Filter {
15    pub fn new() -> Self {
16        Self::default()
17    }
18
19    /// Add an include pattern (-P)
20    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    /// Add an exclude pattern (-I)
31    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    /// Check if a filename matches the filter criteria
42    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        // Check exclude patterns first
50        for pattern in &self.exclude_patterns {
51            if pattern.matches(&match_name) {
52                return false;
53            }
54        }
55
56        // Check include patterns (if any are specified)
57        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}