1use ignore::overrides::OverrideBuilder;
2use ignore::WalkBuilder;
3use std::path::Path;
4
5#[derive(Debug, Clone)]
7pub struct FilterOptions {
8 pub git_ignore: bool,
10 pub ignore_files: bool,
12 pub skip_hidden: bool,
14 pub parents: bool,
16 pub overrides: Vec<String>,
18}
19
20impl Default for FilterOptions {
21 fn default() -> Self {
22 Self {
23 git_ignore: true,
24 ignore_files: true,
25 skip_hidden: true,
26 parents: true,
27 overrides: Vec::new(),
28 }
29 }
30}
31
32pub fn config_hash(opts: &FilterOptions) -> u64 {
34 use std::hash::{Hash, Hasher};
35 let mut h = std::collections::hash_map::DefaultHasher::new();
36 opts.git_ignore.hash(&mut h);
37 opts.ignore_files.hash(&mut h);
38 opts.skip_hidden.hash(&mut h);
39 opts.parents.hash(&mut h);
40 for line in &opts.overrides {
41 line.hash(&mut h);
42 }
43 h.finish()
44}
45
46pub fn apply_walk_builder(root: &Path, opts: &FilterOptions) -> Result<WalkBuilder, ignore::Error> {
48 let mut wb = WalkBuilder::new(root);
49 wb.git_ignore(opts.git_ignore)
50 .ignore(opts.ignore_files)
51 .hidden(opts.skip_hidden)
52 .parents(opts.parents);
53
54 if !opts.overrides.is_empty() {
55 let mut ob = OverrideBuilder::new(root);
56 for pat in &opts.overrides {
57 ob.add(pat)?;
58 }
59 wb.overrides(ob.build()?);
60 }
61
62 Ok(wb)
63}