Expand description

Overview

This crate provides a set of components that describe the properties and behaviors of recurring events.

The typical usage of this crate is to create a recurring event, define its recurrences rules (e.g. happens on every tuesday, happens on the 15th of the month) and then get from the event the next date(s) that match the rules.

Four periodicities are currently supported (daily, weekly, monthly and yearly) through four types : DailyEvent, WeeklyEvent, MonthlyEvent and YearlyEvent.

Example of using a yearly event

use recurring_event::{MonthlyWeekdayOrdinal, Ordinal, Recurrent, YearlyEvent,
    time::{Month, OffsetDateTime, Weekday, macros::datetime}};

// This yearly event starts recurring on the 14th of November 2018.
let mut event = YearlyEvent::new(datetime!(2018-11-14 00:00 UTC));

// It's an event that recurs every four years.
event.update_frequency(4);

// On a year, the event happens on every Monday and Thursday of February.
event.insert_weekday(Weekday::Monday, Month::February);
event.insert_weekday(Weekday::Thursday, Month::February);

// And also on the 7th and 15th of February.
event.insert_monthly_day_ordinal(7, Month::February);
event.insert_monthly_day_ordinal(25, Month::February);

// And also on the second Tuesday and the last Sunday of February.
event.insert_monthly_weekday_ordinal(
    MonthlyWeekdayOrdinal::new(Ordinal::Second, Weekday::Tuesday),
    Month::February);
event.insert_monthly_weekday_ordinal(
    MonthlyWeekdayOrdinal::new(Ordinal::Last, Weekday::Sunday),
    Month::February);

// The event also happens on August, every Tuesday and Saturday.
event.insert_weekday(Weekday::Tuesday, Month::August);
event.insert_weekday(Weekday::Saturday, Month::August);

// And on the 13th and 29th of August.
event.insert_monthly_day_ordinal(13, Month::August);
event.insert_monthly_day_ordinal(29, Month::August);

// And on the first Wednesday and third Friday of August.
event.insert_monthly_weekday_ordinal(
    MonthlyWeekdayOrdinal::new(Ordinal::First, Weekday::Wednesday),
    Month::August);
event.insert_monthly_weekday_ordinal(
    MonthlyWeekdayOrdinal::new(Ordinal::Third, Weekday::Friday),
    Month::August);

// One possibility for getting the next occurrence dates is to take advantage of the fact
// that a YearlyEvent implement the Iterator trait.
// Let's get the next fourty occurrence dates !
let next_occurrences_dates: Vec<OffsetDateTime> = event.take(40).collect();

let expected_dates = vec![datetime!(2022-02-03 00:00 UTC),
    datetime!(2022-02-07 00:00 UTC),
    datetime!(2022-02-08 00:00 UTC),
    datetime!(2022-02-10 00:00 UTC),
    datetime!(2022-02-14 00:00 UTC),
    datetime!(2022-02-17 00:00 UTC),
    datetime!(2022-02-21 00:00 UTC),
    datetime!(2022-02-24 00:00 UTC),
    datetime!(2022-02-25 00:00 UTC),
    datetime!(2022-02-27 00:00 UTC),
    datetime!(2022-02-28 00:00 UTC),
    datetime!(2022-08-02 00:00 UTC),
    datetime!(2022-08-03 00:00 UTC),
    datetime!(2022-08-06 00:00 UTC),
    datetime!(2022-08-09 00:00 UTC),
    datetime!(2022-08-13 00:00 UTC),
    datetime!(2022-08-16 00:00 UTC),
    datetime!(2022-08-19 00:00 UTC),
    datetime!(2022-08-20 00:00 UTC),
    datetime!(2022-08-23 00:00 UTC),
    datetime!(2022-08-27 00:00 UTC),
    datetime!(2022-08-29 00:00 UTC),
    datetime!(2022-08-30 00:00 UTC),
    datetime!(2026-02-02 00:00 UTC),
    datetime!(2026-02-05 00:00 UTC),
    datetime!(2026-02-07 00:00 UTC),
    datetime!(2026-02-09 00:00 UTC),
    datetime!(2026-02-10 00:00 UTC),
    datetime!(2026-02-12 00:00 UTC),
    datetime!(2026-02-16 00:00 UTC),
    datetime!(2026-02-19 00:00 UTC),
    datetime!(2026-02-22 00:00 UTC),
    datetime!(2026-02-23 00:00 UTC),
    datetime!(2026-02-25 00:00 UTC),
    datetime!(2026-02-26 00:00 UTC),
    datetime!(2026-08-01 00:00 UTC),
    datetime!(2026-08-04 00:00 UTC),
    datetime!(2026-08-05 00:00 UTC),
    datetime!(2026-08-08 00:00 UTC),
    datetime!(2026-08-11 00:00 UTC)];

assert_eq!(expected_dates, next_occurrences_dates)

time crate

This crate uses the time crate, in particular the OffsetDateTime, Month, and Weekday types.

An OffsetDateTime stores time and offset (i.e. timezone) information. Currently, this crate doesn’t make any use of them. It is available for your code, should you need to manage specific time and offset in your event (by using the update_current_date method).

serde and typetag crates

(De)serialization of event types is available thanks to serde, and (de)serialization of Box<dyn Recurrent> trait object thanks to typetag.

Re-exports

pub extern crate time;

Modules

Various error types returned by methods in this crate.

Structs

An event whose recurrence rules are defined over a daily period

An event whose recurrence rules are defined over a monthly period.

Ordinal position of a weekday during a month.

An event whose recurrence rules are defined over a weekly period.

An event whose recurrence rules are defined over a yearly period.

Enums

Possible ordinal positions of a weekday during a month.

Possible periodicities of a recurring event.

Traits

Provides the core methods for DailyEvent, WeeklyEvent, MonthlyEvent and YearlyEvent.

Type Definitions

Ordinal position of a day during a month.