From 1407c5f47ad40fc2d637ffcc8dc9f49594115711 Mon Sep 17 00:00:00 2001 From: Astro Date: Thu, 10 Jun 2021 19:48:16 +0200 Subject: [PATCH] ticker-update: feed serialized event to rrule --- libticker/src/ics/mod.rs | 17 +++++++++++++++++ ticker-update/src/main.rs | 38 +++++++++----------------------------- 2 files changed, 26 insertions(+), 29 deletions(-) diff --git a/libticker/src/ics/mod.rs b/libticker/src/ics/mod.rs index 24e1f43..5b4c052 100644 --- a/libticker/src/ics/mod.rs +++ b/libticker/src/ics/mod.rs @@ -57,6 +57,23 @@ impl<'a> GetValue<'a, Timestamp> for Object { } } +impl std::fmt::Display for Object { + fn fmt(&self, fmt: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> { + writeln!(fmt, "BEGIN:{}", self.name)?; + for (name, values) in &self.content { + for (props, value) in values { + write!(fmt, "{}", name)?; + for (key, prop) in props { + write!(fmt, ";{}={}", key, prop)?; + } + writeln!(fmt, ":{}", value)?; + } + } + writeln!(fmt, "END:{}", self.name)?; + Ok(()) + } +} + #[derive(Debug, Clone)] pub enum Timestamp { Date(NaiveDate), diff --git a/ticker-update/src/main.rs b/ticker-update/src/main.rs index 20f9c41..648cbbe 100644 --- a/ticker-update/src/main.rs +++ b/ticker-update/src/main.rs @@ -33,9 +33,9 @@ fn obj_to_events(calendar: String, obj: &Object) -> Vec { return vec![]; } - let (dtstart, dtstart_str): (Timestamp, &str) = match (obj.get("DTSTART"), obj.get("DTSTART")) { - (Some(dtstart), Some(dtstart_str)) => (dtstart, dtstart_str), - _ => return vec![], + let dtstart: Timestamp = match obj.get("DTSTART") { + Some(dtstart) => dtstart, + None => return vec![], }; let dtstart = dtstart.or_hms(0, 0, 0); let dtend: Option = obj.get("DTEND"); @@ -63,30 +63,8 @@ fn obj_to_events(calendar: String, obj: &Object) -> Vec { } }; - let rrule_str: Option<&str> = obj.get("RRULE"); - let rrule = rrule_str.map(|rrule_str| - format!("DTSTART:{}\nRRULE:{}", dtstart_str, rrule_str) - ).map(|mut s| { - for exdate in obj.get("EXDATE") - .unwrap_or(&[][..]) { - s = format!("{}\nEXDATE:{}", s, exdate.1); - } - for exrule in obj.get("EXRULE") - .unwrap_or(&[][..]) { - s = format!("{}\nEXRULE:{}", s, exrule.1); - } - for rdate in obj.get("RDATE") - .unwrap_or(&[][..]) { - s = format!("{}\nRDATE:{}", s, rdate.1); - } - s - }).and_then(|s| - RRule::from_str(&s) - .map_err(|e| println!("Error parsing RRULE: {}", e)) - .ok() - ); - match rrule { - Some(rrule) => { + match RRule::from_str(&format!("{}", obj)) { + Ok(rrule) => { let now = Utc::now(); let start = now - Duration::days(RRULE_LOOKBACK); let end = now + Duration::days(RRULE_LOOKAHEAD); @@ -97,8 +75,10 @@ fn obj_to_events(calendar: String, obj: &Object) -> Vec { .map(|dtstart| generate_event(dtstart, true)) .collect() } - None => - vec![generate_event(dtstart, false)], + Err(e) => { + println!("Error parsing RRULE: {}", e); + vec![generate_event(dtstart, false)] + } } }