aboutsummaryrefslogtreecommitdiff
path: root/src/events.rs
diff options
context:
space:
mode:
authorRuben Pollan2018-04-29 20:10:43 +0200
committerRuben Pollan2018-04-29 20:10:43 +0200
commit26ddc4889560ea1e63e7fec674fbd87bb394acfb (patch)
treebb5c0d00bc4827c8be5c4a1c376f6e7421dadb11 /src/events.rs
parent7a90f7f4cdfc53b65d30df806de0a26ca6b86b8c (diff)
Add Events type
Diffstat (limited to 'src/events.rs')
-rw-r--r--src/events.rs56
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(())
+ }
+}