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 { directories: Vec, config: Config, } impl Directories { pub(crate) fn new(config: &Config) -> Directories { Directories { directories: config.add.to_owned(), config: config.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::, _>>(); self.directories.extend(results?); Ok(self) } pub fn as_stdin(&self) -> String { self.directories .iter() .cloned() .map(|p: PathBuf| p.to_string_lossy().into()) .collect::>() .join("\n") } } impl Deref for Directories { type Target = Vec; fn deref(&self) -> &Self::Target { &self.directories } }