From 46cee052d6d4b60b483ab6841af976d68d954705 Mon Sep 17 00:00:00 2001 From: Toby Vincent Date: Sat, 26 Nov 2022 16:43:14 -0600 Subject: feat: add project filtering --- src/project/path.rs | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 src/project/path.rs (limited to 'src/project/path.rs') diff --git a/src/project/path.rs b/src/project/path.rs new file mode 100644 index 0000000..24dad9d --- /dev/null +++ b/src/project/path.rs @@ -0,0 +1,74 @@ +use ignore::DirEntry; +use std::{ + path::PathBuf, + time::{Duration, SystemTime}, +}; + +use crate::Project; + +#[derive(Debug, PartialEq, Eq, Clone, Default)] +pub struct PathProject { + path_buf: PathBuf, + timestamp: Option, +} + +impl PathProject { + fn new(path_buf: PathBuf) -> Self { + let timestamp = path_buf + .metadata() + .ok() + .and_then(|m| m.modified().ok()) + .and_then(|t| t.duration_since(SystemTime::UNIX_EPOCH).ok()); + + Self { + timestamp, + path_buf, + } + } +} + +impl Project for PathProject { + fn timestamp(&self) -> Option { + self.timestamp + } + + fn to_path_buf(&self) -> PathBuf { + self.path_buf.to_owned() + } +} + +impl TryFrom<(&String, DirEntry)> for PathProject { + type Error = String; + + fn try_from((pattern, dir_entry): (&String, DirEntry)) -> Result { + dir_entry + .path() + .join(pattern) + .exists() + .then(|| Self::from(dir_entry.to_owned())) + .ok_or_else(|| { + format!( + "Pattern `{:?}` not found in path: `{:?}`", + pattern, dir_entry + ) + }) + } +} + +impl From for PathProject { + fn from(value: PathBuf) -> Self { + Self::new(value) + } +} + +impl From for PathProject { + fn from(value: DirEntry) -> Self { + Self::new(value.into_path()) + } +} + +impl From for PathBuf { + fn from(value: PathProject) -> Self { + value.path_buf + } +} -- cgit v1.2.3-70-g09d2