From 175a6c20a83549dcc70cdf46f16fff629de9277f Mon Sep 17 00:00:00 2001 From: Andrei Stoica Date: Tue, 13 Jun 2023 07:59:09 -0400 Subject: [PATCH] isolated TodoFile into module --- src/main.rs | 145 +++++++++++++++++++++++++++++----------------------- 1 file changed, 80 insertions(+), 65 deletions(-) diff --git a/src/main.rs b/src/main.rs index 0f59af1..77aedb9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,19 +1,12 @@ use chrono::naive::NaiveDate; -use chrono::{Local, Datelike}; -use regex::Regex; -use std::convert::TryFrom; -use std::fs::{self, DirEntry}; -use std::path::{Path, PathBuf}; -use std::str::FromStr; +use chrono::{Datelike, Local}; use std::env; +use std::fs; +use std::path::{Path, PathBuf}; +use todo_file::TodoFile; //TODO handle unwraps and errors more uniformly - -#[derive(Debug)] -struct TodoFile { - file: DirEntry, - date: NaiveDate, -} +//TODO move TodoFile into its file fn main() { let data_dir = get_data_dir("notes"); @@ -35,7 +28,81 @@ fn main() { Some(today) if latest_file.date < today => println!("Todays file was not created"), Some(today) if latest_file.date > today => println!("Future files were created"), - _ => println!("Today never happend!") + _ => println!("Today never happend!"), + } +} + +mod todo_file { + use chrono::naive::NaiveDate; + use std::convert::TryFrom; + use std::fs::DirEntry; + use std::str::FromStr; + use regex::Regex; + + #[derive(Debug)] + pub struct TodoFile { + pub file: DirEntry, + pub date: NaiveDate, + } + + impl TodoFile { + fn capture_as_number( + capture: ®ex::Captures, + name: &str, + ) -> Result { + Ok(capture + .name(name) + .unwrap() + .as_str() + .parse::() + .ok() + .ok_or("Something went wrong".to_owned())?) + } + + pub fn latest_file(a: TodoFile, b: TodoFile) -> TodoFile { + if a.date > b.date { + a + } else { + b + } + } + + fn get_file_regex() -> Regex { + //TODO This would ideally be configurable + Regex::new(r"(?P\d{4})-(?P\d{2})-(?P\d{2}).md") + .expect("could not create regex") + } + } + + impl TryFrom for TodoFile { + type Error = String; + + fn try_from(direntry: DirEntry) -> Result { + let re = TodoFile::get_file_regex(); + println!("{:?}", re); + let file_name = direntry.file_name(); + let file_name_str = match file_name.to_str() { + Some(name) => name, + _ => "", + }; + println!("{:?}", file_name_str); + + if let Some(caps) = re.captures(file_name_str) { + let year: i32 = Self::capture_as_number(&caps, "year").unwrap(); + let month: u32 = Self::capture_as_number(&caps, "month").unwrap(); + let day: u32 = Self::capture_as_number(&caps, "day").unwrap(); + + return Ok(Self { + file: direntry, + date: NaiveDate::from_ymd_opt(year, month, day).unwrap(), + }); + }; + Err(format!( + "Could not parse file name => {{ name: {:?}, re: {:?} }}", + file_name, re + ) + .to_string()) + } } } @@ -58,55 +125,3 @@ fn get_latest_file(dir: &Path) -> Result { .reduce(|a, b| TodoFile::latest_file(a, b)) .ok_or("Could not reduce items".to_string()) } - -fn get_file_regex() -> Regex { - Regex::new(r"(?P\d{4})-(?P\d{2})-(?P\d{2}).md") - .expect("could not create regex") -} - -impl TodoFile { - fn capture_as_number(capture: ®ex::Captures, name: &str) -> Result { - Ok(capture - .name(name) - .unwrap() - .as_str() - .parse::() - .ok() - .ok_or("Something went wrong".to_owned())?) - } - - pub fn latest_file(a: TodoFile, b: TodoFile) -> TodoFile { - if a.date > b.date { - a - } else { - b - } - } -} - -impl TryFrom for TodoFile { - type Error = String; - - fn try_from(direntry: DirEntry) -> Result { - let re = get_file_regex(); - println!("{:?}", re); - let file_name = direntry.file_name(); - let file_name_str = match file_name.to_str() { - Some(name) => name, - _ => "" - }; - println!("{:?}", file_name_str); - - if let Some(caps) = re.captures(file_name_str) { - let year: i32 = Self::capture_as_number(&caps, "year").unwrap(); - let month: u32 = Self::capture_as_number(&caps, "month").unwrap(); - let day: u32 = Self::capture_as_number(&caps, "day").unwrap(); - - return Ok(Self { - file: direntry, - date: NaiveDate::from_ymd_opt(year, month, day).unwrap(), - }); - }; - Err(format!("Could not parse file name => {{ name: {:?}, re: {:?} }}", file_name, re).to_string()) - } -}