1use config::Options;
2use ignore::types::TypesBuilder;
3use ignore::{Error, Walk, WalkBuilder};
4use std::path::Path;
5
6pub 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
33pub 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}