From 233967e1770931d2e8c62514396b43e8a8bb5ad0 Mon Sep 17 00:00:00 2001 From: Bel LaPointe <153096461+breel-render@users.noreply.github.com> Date: Wed, 15 May 2024 22:24:21 -0400 Subject: [PATCH] okeydoke --- pttodoer/src/main.rs | 120 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 116 insertions(+), 4 deletions(-) diff --git a/pttodoer/src/main.rs b/pttodoer/src/main.rs index 30623de..d625f7f 100644 --- a/pttodoer/src/main.rs +++ b/pttodoer/src/main.rs @@ -30,14 +30,126 @@ struct When(String); impl When { fn new(src: String) -> Result { - let duration = Regex::new(r"").unwrap(); + match Self::new_duration(src.clone()) { + Some(x) => { return Ok(x); }, + None => {}, + }; + match Self::new_ts(src.clone()) { + Some(x) => { return Ok(x); }, + None => {}, + }; + match Self::new_cron(src.clone()) { + Some(x) => { return Ok(x); }, + None => {}, + }; + Err(format!("cannot parse when {}", src)) + } + + fn new_duration(src: String) -> Option { + match Duration::new(src.clone()) { + Ok(_) => Some(When{0: src.clone()}), + _ => None, + } + } + + fn new_ts(src: String) -> Option { + match TS::new(src.clone()) { + Ok(_) => Some(When{0: src.clone()}), + _ => None, + } + } + + fn new_cron(src: String) -> Option { + match Cron::new(src.clone()) { + Ok(_) => Some(When{0: src.clone()}), + _ => None, + } + } +} + +#[cfg(test)] +mod test_when { + use super::*; + + #[test] + fn parse() { + match When::new("1d2h3m".to_string()) { + Ok(when) => { + assert!(false, "not impl: {:?}", when); + }, + Err(err) => assert!(false, "failed to parse when: {}", err), + }; + } +} + +#[derive(Debug)] +struct Cron(String); + +impl Cron { + fn new(src: String) -> Result { + Err("not impl".to_string()) + } +} + +#[derive(Debug)] +struct Duration(u64); + +impl Duration { + fn new(src: String) -> Result { + let duration = Regex::new(r"([0-9]+d)?([0-9]+h)?([0-9]+m)?").unwrap(); match duration.is_match(&src) { + false => { return Err("ill formatted duration".to_string()); }, _ => {}, }; - Err("not impl: Duration".to_string()) + let caps = duration.captures(&src).unwrap(); + let mut sum: u64 = 0; + match caps.get(1) { + Some(d) => { sum += 60 * 60 * 24 * Self::to_n(d.as_str()); }, + _ => {}, + }; + match caps.get(2) { + Some(h) => { sum += 60 * 60 * Self::to_n(h.as_str()); }, + _ => {}, + }; + match caps.get(3) { + Some(m) => { sum += 60 * Self::to_n(m.as_str()); }, + _ => {}, + }; + Ok(Duration{0: sum}) + } - //Err("not impl: TS".to_string()) - //Err("not impl: cron".to_string()) + fn to_n(s: &str) -> u64 { + let s = s.to_string(); + let (s, _) = s.split_at(s.len()-1); + match s.parse::() { + Ok(n) => n, + _ => 0, + } + } +} + +#[cfg(test)] +mod test_duration { + use super::*; + + #[test] + fn parse() { + match Duration::new("1d2h3m".to_string()) { + Ok(d) => assert_eq!(60*60*24 + 60*60*2 + 60*3, d.0), + Err(err) => assert!(false, "failed to parse duration: {}", err), + }; + match Duration::new("1d".to_string()) { + Ok(d) => assert_eq!(60*60*24, d.0), + Err(err) => assert!(false, "failed to parse duration: {}", err), + }; + match Duration::new("2h".to_string()) { + Ok(d) => assert_eq!(60*60*2, d.0), + Err(err) => assert!(false, "failed to parse duration: {}", err), + }; + match Duration::new("3m".to_string()) { + Ok(d) => assert_eq!(60*3, d.0), + Err(err) => assert!(false, "failed to parse duration: {}", err), + }; } }