tre/
walker.rs

1use config::Options;
2use ignore::types::TypesBuilder;
3use ignore::{Error, Walk, WalkBuilder};
4use std::path::Path;
5
6/// Returns a Result for Walker based on options passed in.
7pub fn build(opt: &Options) -> Result<Walk, Error> {
8    let mut walker = WalkBuilder::new(opt.root.clone().unwrap_or(String::from(".")));
9    let mut builder = TypesBuilder::new();
10
11    if let Some(ref pattern) = opt.pattern {
12        builder.add("custom", &format!("*{}*", pattern))?;
13        builder.select("custom");
14    }
15
16    if let Some(ref extension) = opt.extension {
17        builder.add("ext", &format!("*.{}", extension))?;
18        builder.select("ext");
19    }
20
21    let types = builder.build()?;
22
23    walker.types(types);
24    walker.follow_links(opt.follow_sym_links);
25    walker.max_depth(opt.max_depth);
26    walker.hidden(!opt.show_hidden);
27    walker.git_ignore(!opt.show_hidden);
28    walker.sort_by_file_name(|a, b| a.cmp(b));
29
30    Ok(walker.build())
31}
32
33/// Returns a Result for shallow Walker that has the near equilvalent search settings as normal walk.
34/// It always only traverses with depth 1
35pub fn build_shallow(path: &Path, opt: &Options) -> Result<Walk, Error> {
36    let path = path
37        .to_str()
38        .expect("Invalid UTF8 path given to build_shallow")
39        .to_string();
40
41    let shallow_options = Options::new(
42        Some(path),
43        Some(1),
44        false,
45        opt.show_hidden,
46        opt.dir_only,
47        opt.pattern.clone(),
48        opt.extension.clone(),
49        opt.line_count,
50        opt.no_colours,
51    );
52
53    build(&shallow_options)
54}
55
56#[cfg(test)]
57mod tests {
58    use super::*;
59
60    fn options() -> Options {
61        Options::new(
62            Some(String::from(".")),
63            Some(1),
64            true,
65            true,
66            false,
67            None,
68            None,
69            true,
70            false,
71        )
72    }
73
74    #[test]
75    fn build_naive_works() {
76        let walker = build(&options());
77
78        match walker {
79            Ok(_) => assert!(true),
80            Err(err) => panic!(err),
81        }
82    }
83
84    #[test]
85    fn build_shallow_naive_works() {
86        let path = Path::new(".");
87        let walker = build_shallow(path, &options());
88
89        match walker {
90            Ok(_) => assert!(true),
91            Err(err) => panic!(err),
92        }
93    }
94}