use crate::hoard::PileConfig;
use crate::paths::{RelativePath, SystemPath};
pub(crate) mod ignore;
pub trait Filter: Sized {
fn new(pile_config: &PileConfig) -> Self;
fn keep(&self, prefix: &SystemPath, path: &RelativePath) -> bool;
}
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub struct Filters {
ignore: ignore::IgnoreFilter,
}
impl Filter for Filters {
#[tracing::instrument]
fn new(pile_config: &PileConfig) -> Self {
let ignore = ignore::IgnoreFilter::new(pile_config);
Self { ignore }
}
#[tracing::instrument(name = "run_filters")]
fn keep(&self, prefix: &SystemPath, path: &RelativePath) -> bool {
self.ignore.keep(prefix, path)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_filters_derives() {
let config = PileConfig {
ignore: vec![glob::Pattern::new("valid/**").unwrap()],
..PileConfig::default()
};
let filters = Filters::new(&config);
assert!(format!("{filters:?}").contains("Filters"));
assert_eq!(filters.clone().ignore, filters.ignore);
}
}