use glob::Pattern;
#[derive(Debug, Clone, Default)]
pub struct Filter {
pub include_patterns: Vec<Pattern>,
pub exclude_patterns: Vec<Pattern>,
pub ignore_case: bool,
}
impl Filter {
pub fn new() -> Self {
Self::default()
}
pub fn add_include(&mut self, pattern: &str) -> Result<(), glob::PatternError> {
let pattern_str = if self.ignore_case {
pattern.to_lowercase()
} else {
pattern.to_string()
};
self.include_patterns.push(Pattern::new(&pattern_str)?);
Ok(())
}
pub fn add_exclude(&mut self, pattern: &str) -> Result<(), glob::PatternError> {
let pattern_str = if self.ignore_case {
pattern.to_lowercase()
} else {
pattern.to_string()
};
self.exclude_patterns.push(Pattern::new(&pattern_str)?);
Ok(())
}
pub fn matches(&self, name: &str, _is_dir: bool) -> bool {
let match_name = if self.ignore_case {
name.to_lowercase()
} else {
name.to_string()
};
for pattern in &self.exclude_patterns {
if pattern.matches(&match_name) {
return false;
}
}
if !self.include_patterns.is_empty() {
for pattern in &self.include_patterns {
if pattern.matches(&match_name) {
return true;
}
}
return false;
}
true
}
}