diff options
author | Toby Vincent <tobyv13@gmail.com> | 2023-04-28 17:32:24 -0500 |
---|---|---|
committer | Toby Vincent <tobyv13@gmail.com> | 2023-04-28 17:32:24 -0500 |
commit | 589cd987217755e1da7acbc304c373a75a9f7db5 (patch) | |
tree | 2730a697e4f7b2f779fcd96b0452719cc67f36e3 /src/project/path.rs | |
parent | a98b50667bc6a11e4b8be464969adc14601e9e78 (diff) |
refactor: simplify logic and clean up dep.
Diffstat (limited to 'src/project/path.rs')
-rw-r--r-- | src/project/path.rs | 57 |
1 files changed, 11 insertions, 46 deletions
diff --git a/src/project/path.rs b/src/project/path.rs index 5954ff9..0e38990 100644 --- a/src/project/path.rs +++ b/src/project/path.rs @@ -1,57 +1,22 @@ -use std::path::{Path, PathBuf}; -use std::time::{Duration, SystemTime}; -use tracing::debug; +use std::{io::ErrorKind, path::PathBuf}; -use super::{ProjectItem, ProjectParser}; +use super::{Project, ProjectParser}; #[derive(Debug, Clone)] pub enum PathMatcher { - All(PathBuf), + All, Pattern(String), } impl ProjectParser for PathMatcher { #[tracing::instrument] - fn parse(&self, path_buf: PathBuf) -> Option<ProjectItem> { - match self { - PathMatcher::All(p) if &path_buf != p => Some(Box::new(PathProject::new(path_buf))), - PathMatcher::Pattern(p) if path_buf.join(p).exists() => { - Some(Box::new(PathProject::new(path_buf))) - } - _ => { - debug!("Failed to match pattern in directory"); - None - } - } - } -} - -#[derive(Debug, PartialEq, Eq, Clone, Default)] -pub struct PathProject(PathBuf, Duration); - -impl PathProject { - pub fn new(path_buf: PathBuf) -> Self { - let modified = Self::get_modified(&path_buf).unwrap_or_default(); - Self(path_buf, modified) - } - - fn get_modified(path_buf: &Path) -> Result<Duration, std::io::Error> { - path_buf - .metadata()? - .modified()? - .duration_since(SystemTime::UNIX_EPOCH) - .map_err(|err| std::io::Error::new(std::io::ErrorKind::Other, err.to_string())) - } -} - -impl AsRef<PathBuf> for PathProject { - fn as_ref(&self) -> &PathBuf { - &self.0 - } -} - -impl AsRef<Duration> for PathProject { - fn as_ref(&self) -> &Duration { - &self.1 + fn parse(&self, path_buf: PathBuf) -> Result<Project, Box<dyn std::error::Error>> { + let project = match self { + PathMatcher::All => path_buf.try_into()?, + PathMatcher::Pattern(p) if path_buf.join(p).exists() => path_buf.try_into()?, + _ => return Err(Box::new(std::io::Error::from(ErrorKind::NotFound))), + }; + + Ok(project) } } |