1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
//! This crate allows to parse a cron-like, human-readable expression. //! The resulting object can be turned into an iterator to compute the next //! `time::OffsetDateTime` one at a time. //! //! The basic idea was to strip down the set of features that we know from our favorite //! implementation of cron in order to keep the results predictable, which may or may //! not be the case with cron in some situations (e.g. using the step notation "*/2"). //! //! # Example //! ```rust //! use cron_lingo::Timetable; //! use std::str::FromStr; //! //! let expr = "at 9 o'clock on Monday and Friday"; //! let timetable = Timetable::from_str(expr).unwrap(); //! assert!(timetable.iter().next().is_some()); //! ``` //! //! # Expression syntax //! //! The syntax is quite limited, but intentionally so. //! //! Here are a few examples: //! //! | Hour | Weekday (optional) | Week (optional) | //! | ---------------------- | ----------------------- | ------------------------------- | //! | at every hour | on Monday and Tuesday | in odd weeks | //! | at 7 and 8 o'clock | on Tuesday, Saturday | in even weeks | //! | at 7, 8 and 16 o'clock | on Friday | | //! | at 6, 12, 18 o'clock | | | //! | at 8 o'clock | | in odd weeks | //! | at 8 o'clock | on Wednesday | in the first week of the month | //! | at 8 o'clock | on Wednesday | in the second week of the month | //! | at 8 o'clock | on Wednesday | in the third week of the month | //! | at 8 o'clock | on Wednesday and Sunday | in the fourth week of the month | //! //! The examples are quite self-explanatory, but the last four may need some clarification: //! In the final example, `next()` could return the date of the fourth Wednesday of this month //! (or the next if the current one is in the past). But only if the fourth Sunday of this //! month does not predate the fourth Wednesday, which may be the case when the month in question //! begins on e.g. Friday. //! //! As you can also see in the table above the column "Week" does not depend on the second block //! "Weekday". However omitting the Weekday spec. rarely makes sense. The example in row #5 would //! (assuming now is a Sunday in an even week) return a `time::OffsetDateTime` for the next seven //! days ... and then put in a break for the following week. pub mod error; pub mod timetable; pub use self::timetable::Timetable;