blob: df07c576bcaaeca2d0607e70f4be8ac5ba921637 (
plain)
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
|
use ignore::WalkBuilder;
use std::{ops::Deref, path::PathBuf};
pub use config::Config;
pub use error::{Error, Result};
mod config;
mod error;
#[derive(Debug, PartialEq, Eq, Default)]
pub struct Directories {
config: Config,
pub directories: Vec<PathBuf>,
}
impl Directories {
pub(crate) fn new(config: &Config) -> Directories {
Directories {
config: config.to_owned(),
directories: config.add.to_owned(),
}
}
pub(crate) fn walk(&mut self) -> Result<&mut Directories> {
let mut dirs = self.config.search.iter().cloned();
// Taking first element is neccissary due to requirement of an initial item
// in the WalkBuilder API
//
// See: https://github.com/BurntSushi/ripgrep/issues/1761
let first = dirs.next().unwrap_or_default();
let mut walk = WalkBuilder::new(first);
let walk = walk.standard_filters(true).max_depth(Some(1));
let results = dirs
.fold(walk, |walk, dir| walk.add(dir))
.build()
.map(|r| r.map(|d| d.into_path()))
.collect::<std::result::Result<Vec<_>, _>>();
self.directories.extend(results?);
Ok(self)
}
}
impl Deref for Directories {
type Target = Vec<PathBuf>;
fn deref(&self) -> &Self::Target {
&self.directories
}
}
|