Skip to main content

cron_task_scheduler/
cron_parser.rs

1use 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}