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, } impl Directories { pub fn new(config: &Config) -> Directories { Directories { config: config.to_owned(), directories: config.add.to_owned(), } } pub 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::, _>>(); self.directories.extend(results?); Ok(self) } } impl Deref for Directories { type Target = Vec; fn deref(&self) -> &Self::Target { &self.directories } }