diff options
Diffstat (limited to '')
-rw-r--r-- | src/periodic.rs | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/src/periodic.rs b/src/periodic.rs index b557ef7..19874e4 100644 --- a/src/periodic.rs +++ b/src/periodic.rs @@ -1,6 +1,6 @@ use std::fmt; use std::str::FromStr; -use std::collections::HashSet; +use std::collections::HashMap; use chrono::{Duration, Weekday}; @@ -8,6 +8,8 @@ use date::Date; use event::{Event, End}; use errors::EventError; +pub type Byday = HashMap<Weekday, Vec<i32>>; + #[derive(Debug)] pub struct Periodic { pub event: Event, @@ -15,7 +17,7 @@ pub struct Periodic { pub interval: i64, pub count: Option<i64>, pub until: Option<Date>, - pub byday: Option<HashSet<Weekday>>, + pub byday: Option<Byday>, pub wkst: Weekday, } @@ -115,7 +117,7 @@ impl<'a> Iter<'a> { if weekday == p.wkst { days += 7 * (p.interval - 1); } - while !byday.contains(&weekday) { + while !byday.contains_key(&weekday) { weekday = weekday.succ(); days += 1; if weekday == p.wkst { @@ -127,6 +129,7 @@ impl<'a> Iter<'a> { } } Freq::Monthly => { + // TODO: byday... let new_date = if date.month() == 12 { date.with_month(1) .unwrap() @@ -137,6 +140,7 @@ impl<'a> Iter<'a> { }; new_date - date } + // TODO: byday... Freq::Yearly => date.with_year(date.year() + 1).unwrap() - date, } } @@ -170,10 +174,21 @@ impl FromStr for Freq { } } -fn parse_byday(s: &str) -> Result<HashSet<Weekday>, EventError> { - let mut byday = HashSet::new(); +fn parse_byday(s: &str) -> Result<Byday, EventError> { + let mut byday = Byday::new(); for v in s.split(",") { - byday.insert(parse_weekday(v)?); + let weekday = parse_weekday(&v[v.len() - 2..])?; + let occurrence = if v.len() > 2 { + v[..v.len() - 2].parse()? + } else { + 0 + }; + match byday.get_mut(&weekday) { + Some(occurrences) => occurrences.push(occurrence), + None => { + byday.insert(weekday, vec![occurrence]); + } + }; } Ok(byday) } |