[][src]Crate rrule

A partial implementation of recurrence rules as defined in the iCalendar RFC.

Examples

RRule

extern crate rrule;

use rrule::build_rrule;

// Parse a RRule string, return a RRule type
let mut rrule = build_rrule("DTSTART:20120201T093000Z\nRRULE:FREQ=WEEKLY;INTERVAL=5;UNTIL=20130130T230000Z;BYDAY=MO,FR").unwrap();
assert_eq!(rrule.all().len(), 21);

RRuleSet

extern crate rrule;

use rrule::build_rruleset;
 
// Parse a RRuleSet string, return a RRuleSet type
let mut rrule = build_rruleset("DTSTART:20120201T023000Z\nRRULE:FREQ=MONTHLY;COUNT=5\nRDATE:20120701T023000Z,20120702T023000Z\nEXRULE:FREQ=MONTHLY;COUNT=2\nEXDATE:20120601T023000Z").unwrap();
assert_eq!(rrule.all().len(), 4);

Using Options instead of str to build RRule and RRuleSet

extern crate rrule;
extern crate chrono; 
extern crate chrono_tz; 

use chrono::prelude::*;
use chrono_tz::UTC;
use rrule::{RRule, RRuleSet, Options, Frequenzy, Weekday};
 
// Build options that starts first day in 2020 at 9:00AM and occurs daily 5 times
let mut options = Options::new()
    .dtstart(UTC.ymd(2020, 1, 1).and_hms(9, 0, 0))
    .count(5)
    .freq(Frequenzy::Daily)
    .build()
    .unwrap();
 
// Construct `RRule` from options 
let mut rrule = RRule::new(options);
let occurences = rrule.all();
for i in 0..5 {
    assert_eq!(occurences[i].year(), 2020);
    assert_eq!(occurences[i].month(), 1);
    assert_eq!(occurences[i].day(), 1 + i as u32);
    assert_eq!(occurences[i].hour(), 9);
}
assert_eq!(occurences.len(), 5);





// Construct RRuleSet from one rrule and exrule
// The rrule will occur weekly on Tuesday and Wednesday and the exrule
// will occur weekly on Wednesday, and therefore the end result will contain
// weekly occurences just on Wednesday.


// Build options for rrule that occurs weekly on Tuesday and Wednesday
let mut rrule_options = Options::new()
    .dtstart(UTC.ymd(2020, 1, 1).and_hms(9, 0, 0))
    .count(4)
    .freq(Frequenzy::Weekly)
    .byweekday(vec![Weekday::Tue, Weekday::Wed])
    .build()
    .unwrap();
 
// Construct `RRule` from options 
let mut rrule = RRule::new(rrule_options);


// Build options for ecrule that occurs weekly on Wednesday
let mut exrule_options = Options::new()
    .dtstart(UTC.ymd(2020, 1, 1).and_hms(9, 0, 0))
    .count(4)
    .freq(Frequenzy::Weekly)
    .byweekday(vec![Weekday::Wed])
    .build()
    .unwrap();
 
// Construct `RRule` from options 
let mut exrule = RRule::new(exrule_options);

// Now create the RRuleSet and add rrule and exrule
let mut rrule_set = RRuleSet::new();
rrule_set.rrule(rrule);
rrule_set.exrule(exrule);
 
let occurences = rrule_set.all();

for occurence in &occurences {
    assert_eq!(occurence.weekday(), Weekday::Tue);
}
 
assert_eq!(occurences.len(), 2);

Timezone support

extern crate rrule;
extern crate chrono; 
extern crate chrono_tz; 

use chrono::prelude::*;
use chrono_tz::{UTC, Tz};
use chrono_tz::Europe::{Berlin, Moscow};
use rrule::{RRule, RRuleSet, Options, Frequenzy, Weekday};

// SOME NOTES:
// Occurences produces by RRule or RRuleSet will be in the same timezone 
// as the start datetime provided (dtstart). The `until` datetime MUST 
// always be specified with the UTC timezone if it is specified.
// Example:
// The following examples uses an RRuleSet with an RRule that yields occurences 
// in the Europe/Berlin timezone, and contains one EXDATE that is specified 
// in UTC and collides (and therefore filters away) with one of those occurences.  


// Build options for rrule that occurs daily at 9 oclock
let mut rrule_options = Options::new()
    .dtstart(Berlin.ymd(2020, 1, 1).and_hms(9, 0, 0))
    .count(4)
    .freq(Frequenzy::Daily)
    .build()
    .unwrap();
 
let mut rrule = RRule::new(rrule_options);

// Exdate in the UTC at 8 oclock which is 9 oclock in Berlin and therefore 
// collides with one of the rrule occurences.
let exdate = UTC.ymd(2020, 1, 2).and_hms(8, 0, 0);
 
// Now create the RRuleSet and add rrule and exdate
let mut rrule_set = RRuleSet::new();
rrule_set.rrule(rrule);
rrule_set.exdate(exdate);
 
let occurences = rrule_set.all();
// RRule contained 4 occurences but 1 was filtered away by the exdate
assert_eq!(occurences.len(), 3);

// If you want to get back the DateTimes in another timezone (In this case Moscow).
// Refer to the chrono and chrono-tz crates for more documentation on how to work with
// their DateTime type and timezones. 
let occurences_in_moscow_tz: Vec<DateTime<Tz>> = occurences.iter()
    .map(|d| d.with_timezone(&Moscow)).collect();

Structs

Options
ParsedOptions
RRule
RRuleSet

Enums

Frequenzy
Weekday

The day of week.

Functions

build_rrule
build_rruleset