diff options
Diffstat (limited to 'src/project/path.rs')
-rw-r--r-- | src/project/path.rs | 74 |
1 files changed, 74 insertions, 0 deletions
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<Duration>, +} + +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<Duration> { + 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<Self, Self::Error> { + 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<PathBuf> for PathProject { + fn from(value: PathBuf) -> Self { + Self::new(value) + } +} + +impl From<DirEntry> for PathProject { + fn from(value: DirEntry) -> Self { + Self::new(value.into_path()) + } +} + +impl From<PathProject> for PathBuf { + fn from(value: PathProject) -> Self { + value.path_buf + } +} |