cron_task_scheduler/
cron_parser.rs1use chrono::{DateTime, Utc};
2use cron::Schedule;
3use std::str::FromStr;
4
5pub struct CronParser {
6 schedule: Schedule,
7}
8
9impl CronParser {
10 pub fn new(expression: &str) -> Result<Self, Box<dyn std::error::Error + Send + Sync>> {
11 let schedule = Schedule::from_str(expression)?;
12 Ok(Self { schedule })
13 }
14
15 pub fn next_after(&self, from: DateTime<Utc>) -> Option<DateTime<Utc>> {
16 self.schedule.after(&from).next()
17 }
18}
19
20#[cfg(test)]
21mod tests {
22 use super::*;
23 use chrono::TimeZone;
24
25 #[test]
26 fn test_cron_parsing() {
27 let parser = CronParser::new("0 */5 * * * *").unwrap();
28 let now = Utc.with_ymd_and_hms(2024, 1, 1, 0, 0, 0).unwrap();
29 let next = parser.next_after(now).unwrap();
30 assert_eq!(next, Utc.with_ymd_and_hms(2024, 1, 1, 0, 5, 0).unwrap());
31 }
32}