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