summaryrefslogtreecommitdiffstats
path: root/src/projects.rs
diff options
context:
space:
mode:
authorToby Vincent <tobyv13@gmail.com>2022-11-26 16:43:14 -0600
committerToby Vincent <tobyv13@gmail.com>2022-11-26 16:43:14 -0600
commit46cee052d6d4b60b483ab6841af976d68d954705 (patch)
tree19bbe2170c5a2e6af3b306e14c942ccd1393228a /src/projects.rs
parent0f428974b2d7f4cf59490904564e52d134b9ef3a (diff)
feat: add project filtering
Diffstat (limited to 'src/projects.rs')
-rw-r--r--src/projects.rs117
1 files changed, 0 insertions, 117 deletions
diff --git a/src/projects.rs b/src/projects.rs
deleted file mode 100644
index 8819628..0000000
--- a/src/projects.rs
+++ /dev/null
@@ -1,117 +0,0 @@
-use crate::{Config, Result};
-use figment::Provider;
-use ignore::Walk;
-use std::{path::PathBuf, vec::IntoIter};
-use tracing::{error, info};
-
-pub use entry::SearchPath;
-
-mod entry;
-
-pub struct Projects {
- search_path_iter: IntoIter<SearchPath>,
- walk: Option<Walk>,
-}
-
-impl std::fmt::Debug for Projects {
- fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
- f.debug_struct("Projects")
- .field("paths_iter", &self.search_path_iter)
- .finish_non_exhaustive()
- }
-}
-
-impl Projects {
- pub fn new() -> Result<Self> {
- Self::from_provider(Config::figment())
- }
-
- /// Extract `Config` from `provider` to construct new `Paths`
- pub fn from_provider<T: Provider>(provider: T) -> Result<Self> {
- Config::extract(&provider)
- .map_err(Into::into)
- .map(Into::into)
- }
-}
-
-impl From<Vec<SearchPath>> for Projects {
- fn from(value: Vec<SearchPath>) -> Self {
- Self {
- search_path_iter: value.into_iter(),
- walk: None,
- }
- }
-}
-
-impl From<Config> for Projects {
- fn from(value: Config) -> Self {
- value.paths.into()
- }
-}
-
-impl Iterator for Projects {
- type Item = PathBuf;
-
- #[tracing::instrument]
- fn next(&mut self) -> Option<Self::Item> {
- loop {
- match self.walk.as_mut().and_then(|iter| iter.next()) {
- Some(Ok(path)) if SearchPath::filter(&path) => return Some(path.into_path()),
- Some(Ok(path)) => info!(?path, "Ignoring filtered path"),
- Some(Err(err)) => error!(%err, "Ignoring errored path"),
- None => {
- self.walk = Some(self.search_path_iter.next()?.into());
- }
- };
- }
- }
-}
-
-#[cfg(test)]
-mod tests {
- use super::*;
- use pretty_assertions::assert_eq;
- use std::fs;
-
- #[test]
- fn test_iteration() {
- let temp_dir = tempfile::Builder::new()
- .tempdir()
- .unwrap()
- .path()
- .to_owned();
-
- let project_dir = temp_dir.join("project_dir");
- let project1 = temp_dir.join("project_dir/project1");
- let project2 = temp_dir.join("project_dir/project2");
- let project3 = temp_dir.join("project3");
- let project4 = temp_dir.join("subdir/project4");
-
- let paths = Projects::from(Vec::from([
- SearchPath {
- path: project_dir.to_owned(),
- hidden: false,
- max_depth: Some(1),
- },
- SearchPath {
- path: project3.to_owned(),
- hidden: false,
- max_depth: Some(0),
- },
- SearchPath {
- path: project4.to_owned(),
- hidden: false,
- max_depth: Some(0),
- },
- ]));
-
- let mut path_bufs = Vec::from([project_dir, project1, project2, project3, project4]);
- path_bufs.iter().try_for_each(fs::create_dir_all).unwrap();
- path_bufs.sort();
-
- let mut results = paths.into_iter().collect::<Vec<PathBuf>>();
- results.sort();
-
- assert_eq!(path_bufs, results);
- }
-}