use ignore::overrides::OverrideBuilder;
use ignore::WalkBuilder;
use std::path::Path;
#[derive(Debug, Clone)]
pub struct FilterOptions {
pub git_ignore: bool,
pub ignore_files: bool,
pub skip_hidden: bool,
pub parents: bool,
pub overrides: Vec<String>,
}
impl Default for FilterOptions {
fn default() -> Self {
Self {
git_ignore: true,
ignore_files: true,
skip_hidden: true,
parents: true,
overrides: Vec::new(),
}
}
}
pub fn config_hash(opts: &FilterOptions) -> u64 {
use std::hash::{Hash, Hasher};
let mut h = std::collections::hash_map::DefaultHasher::new();
opts.git_ignore.hash(&mut h);
opts.ignore_files.hash(&mut h);
opts.skip_hidden.hash(&mut h);
opts.parents.hash(&mut h);
for line in &opts.overrides {
line.hash(&mut h);
}
h.finish()
}
pub fn apply_walk_builder(root: &Path, opts: &FilterOptions) -> Result<WalkBuilder, ignore::Error> {
let mut wb = WalkBuilder::new(root);
wb.git_ignore(opts.git_ignore)
.ignore(opts.ignore_files)
.hidden(opts.skip_hidden)
.parents(opts.parents);
if !opts.overrides.is_empty() {
let mut ob = OverrideBuilder::new(root);
for pat in &opts.overrides {
ob.add(pat)?;
}
wb.overrides(ob.build()?);
}
Ok(wb)
}