diff options
author | Ruben Pollan | 2018-04-29 20:10:43 +0200 |
---|---|---|
committer | Ruben Pollan | 2018-04-29 20:10:43 +0200 |
commit | 26ddc4889560ea1e63e7fec674fbd87bb394acfb (patch) | |
tree | bb5c0d00bc4827c8be5c4a1c376f6e7421dadb11 /src/events.rs | |
parent | 7a90f7f4cdfc53b65d30df806de0a26ca6b86b8c (diff) |
Add Events type
Diffstat (limited to '')
-rw-r--r-- | src/events.rs | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/src/events.rs b/src/events.rs new file mode 100644 index 0000000..a78a286 --- /dev/null +++ b/src/events.rs @@ -0,0 +1,56 @@ +use std::io::BufRead; +use std::fmt; +use ical::IcalParser; + +use event::{Event, Date}; +use errors::EventError; + +pub struct Events { + single: Vec<Event>, +} + +impl Events { + pub fn parse<B: BufRead>(buf: B) -> Result<Self, EventError> { + let reader = IcalParser::new(buf); + let mut single = Vec::new(); + + for line in reader { + for ev in line?.events { + let mut event = Event::new(); + for property in ev.properties { + let value = property.value.unwrap_or("".to_string()); + let mut time_zone = "".to_string(); + + for (param, value) in property.params.unwrap_or(vec![]) { + if param == "TZID" && value.len() > 0 { + time_zone = value[0].clone(); + } + } + + match property.name.as_ref() { + "SUMMARY" => event.summary = value, + "LOCATION" => event.location = value, + "DESCRIPTION" => event.description = value, + "STATUS" => event.status = value.parse()?, + "DTSTART" => event.start = Date::parse(&value, &time_zone)?, + "DTEND" => event.end = Date::parse(&value, &time_zone)?, + _ => (), + }; + } + single.push(event); + } + } + + single.sort_by(|a, b| a.start.cmp(&b.start)); + Ok(Events { single }) + } +} + +impl fmt::Display for Events { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + for event in &self.single { + writeln!(f, "{}", event)?; + } + Ok(()) + } +} |