diff options
-rw-r--r-- | Cargo.toml | 2 | ||||
-rw-r--r-- | src/lib.rs | 11 | ||||
-rw-r--r-- | src/options.rs | 94 | ||||
-rw-r--r-- | src/parse_options.rs | 3 | ||||
-rw-r--r-- | src/rrulestr.rs | 78 | ||||
-rw-r--r-- | src/yearinfo.rs | 15 | ||||
-rw-r--r-- | tests/rrule.rs | 1 |
7 files changed, 102 insertions, 102 deletions
@@ -2,7 +2,7 @@ name = "rrule" description = "A pure Rust (partial) implementation of recurrence rules as defined in the iCalendar RFC." license = "MIT" -version = "0.2.1" +version = "0.2.2" authors = ["Fredrik Meringdal"] edition = "2018" @@ -11,15 +11,14 @@ mod iterinfo; mod masks; mod monthinfo; mod poslist; -mod rrulestr; mod parse_options; mod yearinfo; mod options; +mod rrulestr; mod rrule; mod rruleset; -pub use rrulestr::build_rule; -pub use rrule::RRule; -pub use rruleset::RRuleSet; -pub use options::{Frequenzy, ParsedOptions}; -pub use rrulestr::PartialOptions;
\ No newline at end of file +pub use crate::rrule::RRule; +pub use crate::rruleset::RRuleSet; +pub use crate::rrulestr::build_rule; +pub use crate::options::{Frequenzy, ParsedOptions, PartialOptions};
\ No newline at end of file diff --git a/src/options.rs b/src/options.rs index a6736a8..e29d8fe 100644 --- a/src/options.rs +++ b/src/options.rs @@ -1,19 +1,5 @@ use chrono::prelude::*; -#[derive(Debug)] -pub struct YearInfo { - pub yearlen: usize, - pub nextyearlen: usize, - pub yearordinal: isize, - pub yearweekday: usize, - pub mmask: Vec<usize>, - pub mrange: Vec<usize>, - pub mdaymask: Vec<isize>, - pub nmdaymask: Vec<isize>, - pub wdaymask: Vec<usize>, - pub wnomask: Option<Vec<usize>>, -} - #[derive(Debug, PartialEq, PartialOrd, Clone)] pub enum Frequenzy { Yearly = 0, @@ -46,4 +32,84 @@ pub struct ParsedOptions { pub bysecond: Vec<usize>, pub bynweekday: Vec<Vec<isize>>, pub byeaster: Option<isize>, +} + +#[derive(Debug, Clone)] +pub struct PartialOptions { + pub freq: Option<Frequenzy>, + pub interval: Option<usize>, + pub count: Option<u32>, + pub until: Option<DateTime<Utc>>, + pub tzid: Option<String>, + pub dtstart: Option<DateTime<Utc>>, + pub wkst: Option<usize>, + pub bysetpos: Option<Vec<isize>>, + pub bymonth: Option<Vec<usize>>, + pub bymonthday: Option<Vec<isize>>, + pub bynmonthday: Option<Vec<isize>>, + pub byyearday: Option<Vec<isize>>, + pub byweekno: Option<Vec<isize>>, + pub byweekday: Option<Vec<usize>>, + pub byhour: Option<Vec<usize>>, + pub byminute: Option<Vec<usize>>, + pub bysecond: Option<Vec<usize>>, + pub bynweekday: Option<Vec<Vec<isize>>>, + pub byeaster: Option<isize>, +} + +impl PartialOptions { + pub fn new() -> Self { + Self { + freq: None, + interval: None, + count: None, + until: None, + tzid: None, + dtstart: None, + wkst: None, + bysetpos: None, + bymonth: None, + bymonthday: None, + bynmonthday: None, + byyearday: None, + byweekno: None, + byweekday: None, + byhour: None, + byminute: None, + bysecond: None, + bynweekday: None, + byeaster: None, + } + } + + fn is_some_or_none<'a, T>(prop1: &'a Option<T>, prop2: &'a Option<T>) -> &'a Option<T> { + if prop2.is_some() { + return prop2; + } + prop1 + } + + pub fn concat(opt1: &Self, opt2: &Self) -> Self { + Self { + freq: Self::is_some_or_none(&opt1.freq, &opt2.freq).clone(), + interval: Self::is_some_or_none(&opt1.interval, &opt2.interval).clone(), + count: Self::is_some_or_none(&opt1.count, &opt2.count).clone(), + until: Self::is_some_or_none(&opt1.until, &opt2.until).clone(), + tzid: Self::is_some_or_none(&opt1.tzid, &opt2.tzid).clone(), + dtstart: Self::is_some_or_none(&opt1.dtstart, &opt2.dtstart).clone(), + wkst: Self::is_some_or_none(&opt1.wkst, &opt2.wkst).clone(), + bysetpos: Self::is_some_or_none(&opt1.bysetpos, &opt2.bysetpos).clone(), + bymonth: Self::is_some_or_none(&opt1.bymonth, &opt2.bymonth).clone(), + bymonthday: Self::is_some_or_none(&opt1.bymonthday, &opt2.bymonthday).clone(), + bynmonthday: Self::is_some_or_none(&opt1.bynmonthday, &opt2.bynmonthday).clone(), + byyearday: Self::is_some_or_none(&opt1.byyearday, &opt2.byyearday).clone(), + byweekno: Self::is_some_or_none(&opt1.byweekno, &opt2.byweekno).clone(), + byweekday: Self::is_some_or_none(&opt1.byweekday, &opt2.byweekday).clone(), + byhour: Self::is_some_or_none(&opt1.byhour, &opt2.byhour).clone(), + byminute: Self::is_some_or_none(&opt1.byminute, &opt2.byminute).clone(), + bysecond: Self::is_some_or_none(&opt1.bysecond, &opt2.bysecond).clone(), + bynweekday: Self::is_some_or_none(&opt1.bynweekday, &opt2.bynweekday).clone(), + byeaster: Self::is_some_or_none(&opt1.byeaster, &opt2.byeaster).clone(), + } + } }
\ No newline at end of file diff --git a/src/parse_options.rs b/src/parse_options.rs index 86c3f94..4071cbc 100644 --- a/src/parse_options.rs +++ b/src/parse_options.rs @@ -1,6 +1,5 @@ use chrono::prelude::*; -use crate::rrulestr::PartialOptions; -use crate::options::{ParsedOptions, Frequenzy}; +use crate::options::{ParsedOptions, Frequenzy, PartialOptions}; // TODO: make this method on partialoptions struct pub fn parse_options(options: &PartialOptions) -> ParsedOptions { diff --git a/src/rrulestr.rs b/src/rrulestr.rs index 98db39a..c1bfc67 100644 --- a/src/rrulestr.rs +++ b/src/rrulestr.rs @@ -15,85 +15,7 @@ static DTSTART_RE: Lazy<Regex> = static RRUle_RE: Lazy<Regex> = Lazy::new(|| Regex::new(r"(?m)^(?:RRULE|EXRULE):").unwrap()); -#[derive(Debug, Clone)] -pub struct PartialOptions { - pub freq: Option<Frequenzy>, - pub interval: Option<usize>, - pub count: Option<u32>, - pub until: Option<DateTime<Utc>>, - pub tzid: Option<String>, - pub dtstart: Option<DateTime<Utc>>, - pub wkst: Option<usize>, - pub bysetpos: Option<Vec<isize>>, - pub bymonth: Option<Vec<usize>>, - pub bymonthday: Option<Vec<isize>>, - pub bynmonthday: Option<Vec<isize>>, - pub byyearday: Option<Vec<isize>>, - pub byweekno: Option<Vec<isize>>, - pub byweekday: Option<Vec<usize>>, - pub byhour: Option<Vec<usize>>, - pub byminute: Option<Vec<usize>>, - pub bysecond: Option<Vec<usize>>, - pub bynweekday: Option<Vec<Vec<isize>>>, - pub byeaster: Option<isize>, -} -impl PartialOptions { - pub fn new() -> Self { - Self { - freq: None, - interval: None, - count: None, - until: None, - tzid: None, - dtstart: None, - wkst: None, - bysetpos: None, - bymonth: None, - bymonthday: None, - bynmonthday: None, - byyearday: None, - byweekno: None, - byweekday: None, - byhour: None, - byminute: None, - bysecond: None, - bynweekday: None, - byeaster: None, - } - } - - fn is_some_or_none<'a, T>(prop1: &'a Option<T>, prop2: &'a Option<T>) -> &'a Option<T> { - if prop2.is_some() { - return prop2; - } - prop1 - } - - pub fn concat(opt1: &Self, opt2: &Self) -> Self { - Self { - freq: Self::is_some_or_none(&opt1.freq, &opt2.freq).clone(), - interval: Self::is_some_or_none(&opt1.interval, &opt2.interval).clone(), - count: Self::is_some_or_none(&opt1.count, &opt2.count).clone(), - until: Self::is_some_or_none(&opt1.until, &opt2.until).clone(), - tzid: Self::is_some_or_none(&opt1.tzid, &opt2.tzid).clone(), - dtstart: Self::is_some_or_none(&opt1.dtstart, &opt2.dtstart).clone(), - wkst: Self::is_some_or_none(&opt1.wkst, &opt2.wkst).clone(), - bysetpos: Self::is_some_or_none(&opt1.bysetpos, &opt2.bysetpos).clone(), - bymonth: Self::is_some_or_none(&opt1.bymonth, &opt2.bymonth).clone(), - bymonthday: Self::is_some_or_none(&opt1.bymonthday, &opt2.bymonthday).clone(), - bynmonthday: Self::is_some_or_none(&opt1.bynmonthday, &opt2.bynmonthday).clone(), - byyearday: Self::is_some_or_none(&opt1.byyearday, &opt2.byyearday).clone(), - byweekno: Self::is_some_or_none(&opt1.byweekno, &opt2.byweekno).clone(), - byweekday: Self::is_some_or_none(&opt1.byweekday, &opt2.byweekday).clone(), - byhour: Self::is_some_or_none(&opt1.byhour, &opt2.byhour).clone(), - byminute: Self::is_some_or_none(&opt1.byminute, &opt2.byminute).clone(), - bysecond: Self::is_some_or_none(&opt1.bysecond, &opt2.bysecond).clone(), - bynweekday: Self::is_some_or_none(&opt1.bynweekday, &opt2.bynweekday).clone(), - byeaster: Self::is_some_or_none(&opt1.byeaster, &opt2.byeaster).clone(), - } - } -} fn datestring_to_date(dt: &str) -> DateTime<Utc> { let bits = DATESTR_RE.captures(dt).unwrap(); diff --git a/src/yearinfo.rs b/src/yearinfo.rs index 8d7fd4b..9bc0906 100644 --- a/src/yearinfo.rs +++ b/src/yearinfo.rs @@ -3,6 +3,21 @@ use crate::options::*; use chrono::prelude::*; use chrono::DateTime; + +#[derive(Debug)] +pub struct YearInfo { + pub yearlen: usize, + pub nextyearlen: usize, + pub yearordinal: isize, + pub yearweekday: usize, + pub mmask: Vec<usize>, + pub mrange: Vec<usize>, + pub mdaymask: Vec<isize>, + pub nmdaymask: Vec<isize>, + pub wdaymask: Vec<usize>, + pub wnomask: Option<Vec<usize>>, +} + fn is_leap_year(year: i32) -> bool { year % 4 == 0 && (year % 100 != 0 || year % 400 == 0) } diff --git a/tests/rrule.rs b/tests/rrule.rs index e23b270..6c5ffa3 100644 --- a/tests/rrule.rs +++ b/tests/rrule.rs @@ -4,7 +4,6 @@ extern crate rrule; use chrono::prelude::*; use chrono_tz::UTC; -use rrule::options::*; use rrule::{RRule, ParsedOptions, Frequenzy}; #[cfg(test)] |