summaryrefslogtreecommitdiffstats
path: root/src/directories.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/directories.rs')
-rw-r--r--src/directories.rs61
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
+ }
+}