diff options
Diffstat (limited to 'src/directories.rs')
-rw-r--r-- | src/directories.rs | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/src/directories.rs b/src/directories.rs new file mode 100644 index 0000000..ad3f3dc --- /dev/null +++ b/src/directories.rs @@ -0,0 +1,61 @@ +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<PathBuf>, + 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::<std::result::Result<Vec<_>, _>>(); + + 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::<Vec<String>>() + .join("\n") + } +} + +impl Deref for Directories { + type Target = Vec<PathBuf>; + + fn deref(&self) -> &Self::Target { + &self.directories + } +} |