diff --git a/pttodoest/src/main.rs b/pttodoest/src/main.rs index f6ddde7..48e7200 100755 --- a/pttodoest/src/main.rs +++ b/pttodoest/src/main.rs @@ -503,20 +503,20 @@ impl Delta { struct Task(serde_yaml::Value); impl Task { - pub fn next_due(&self) -> Option { + pub fn next_due(&self, after: u64) -> Option { match self.schedule() { - Some(schedule) => self.parse_schedule_next(schedule), + Some(schedule) => self.parse_schedule_next(schedule, after), None => Some(1), } } - fn parse_schedule_next(&self, schedule: String) -> Option { + fn parse_schedule_next(&self, schedule: String, after: u64) -> Option { let mut schedule = schedule; if regex::Regex::new(r"^[0-9]+h$").unwrap().is_match(&schedule) { let hours = &schedule[..schedule.len() - 1]; match hours.parse::() { - Ok(hours) => return Some(Delta::now_time() + hours * 60 * 60), + Ok(hours) => return Some(after + hours * 60 * 60), _ => {} }; } @@ -528,7 +528,7 @@ impl Task { schedule += "T00"; } - if regex::Regex::new(r"[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}$") + if regex::Regex::new(r"^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}$") .unwrap() .is_match(&schedule) { @@ -545,6 +545,20 @@ impl Task { }; } + if regex::Regex::new(r"^([^ ]+ ){4}[^ ]+$") + .unwrap() + .is_match(&schedule) + { + let after = chrono::DateTime::from_timestamp(after as i64, 0).unwrap(); + if let Ok(next) = cron_parser::parse(&schedule, &after) { + let seconds = next.format("%s").to_string(); + match seconds.parse::() { + Ok(n) => return Some(n), + _ => {} + }; + } + } + None } @@ -570,7 +584,7 @@ mod test_task { fn test_unscheduled() { let task = Task(serde_yaml::Value::String("hello world".to_string())); assert_eq!(None, task.schedule()); - assert_eq!(Some(1 as u64), task.next_due()); + assert_eq!(Some(1 as u64), task.next_due(100)); } #[test] @@ -579,7 +593,7 @@ mod test_task { m.insert("schedule".into(), "2006-01-02".into()); let task = Task(serde_yaml::Value::Mapping(m)); assert_eq!(Some("2006-01-02".to_string()), task.schedule()); - assert_eq!(Some(1136160000 as u64), task.next_due()); + assert_eq!(Some(1136160000 as u64), task.next_due(100)); } #[test] @@ -588,7 +602,7 @@ mod test_task { m.insert("schedule".into(), "2036-01-02".into()); let task = Task(serde_yaml::Value::Mapping(m)); assert_eq!(Some("2036-01-02".to_string()), task.schedule()); - assert_eq!(Some(2082844800 as u64), task.next_due()); + assert_eq!(Some(2082844800 as u64), task.next_due(100)); } #[test] @@ -597,7 +611,7 @@ mod test_task { m.insert("schedule".into(), "2036-01-02T16".into()); let task = Task(serde_yaml::Value::Mapping(m)); assert_eq!(Some("2036-01-02T16".to_string()), task.schedule()); - assert_eq!(Some(2082902400 as u64), task.next_due()); + assert_eq!(Some(2082902400 as u64), task.next_due(100)); } #[test] @@ -606,7 +620,7 @@ mod test_task { m.insert("schedule".into(), "1h".into()); let task = Task(serde_yaml::Value::Mapping(m)); assert_eq!(Some("1h".to_string()), task.schedule()); - assert_eq!(Some(Delta::now_time() + 60 * 60 as u64), task.next_due()); + assert_eq!(Some(3700), task.next_due(100)); } #[test] @@ -615,7 +629,7 @@ mod test_task { m.insert("schedule".into(), "* * * * *".into()); let task = Task(serde_yaml::Value::Mapping(m)); assert_eq!(Some("* * * * *".to_string()), task.schedule()); - assert_eq!(Some((Delta::now_time()) + 60 % 60 as u64), task.next_due()); + assert_eq!(Some(120 as u64), task.next_due(100)); } }