From 425ec064776fad8ea07f515a1df59d5c4829c9de Mon Sep 17 00:00:00 2001 From: FliegendeWurst <2012gdwu@web.de> Date: Sun, 15 Nov 2020 10:40:15 +0100 Subject: [PATCH] Implement simple duration parsing --- src/ical_parsing.rs | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/ical_parsing.rs b/src/ical_parsing.rs index d47285d..606740b 100644 --- a/src/ical_parsing.rs +++ b/src/ical_parsing.rs @@ -1,4 +1,6 @@ -use chrono::{Duration, NaiveDateTime, NaiveDate}; +use chrono::{Duration, NaiveDate, NaiveDateTime}; +use once_cell::sync::Lazy; +use regex::Regex; use ical::parser::ical::component::IcalEvent; use ical::parser::ical::IcalParser; use thiserror::Error; @@ -75,7 +77,11 @@ fn process_event(event: IcalEvent) -> Result { } // TODO: don't put defaults here let start = start.ok_or(Error::Data("no dtstart"))?; - let end = end.ok_or(Error::Data("no dtend"))?; + let end = if end.is_none() && duration.is_some() { + start + duration.unwrap() + } else { + end.ok_or(Error::Data("no dtend"))? + }; Ok(Event { uid: uid.unwrap_or_default(), summary: summary.unwrap_or_default(), @@ -104,9 +110,16 @@ fn process_dt(value: &str) -> Result { Ok(NaiveDate::from_ymd(year, month, day).and_hms(hour, minute, second)) } -fn process_duration(_value: &str) -> Result { - // TODO - Err(Error::Data("duration parsing not implemented")) +pub static DURATION_PATTERN: Lazy = Lazy::new(|| { + Regex::new(r#"PT(\d+)H(\d+)M"#).unwrap() +}); + +fn process_duration(value: &str) -> Result { + if let Some(data) = DURATION_PATTERN.captures(value) { + Ok(Duration::minutes(data[1].parse::().unwrap() * 60 + data[2].parse::().unwrap())) + } else { + Err(Error::Data("duration parsing not implemented")) + } } #[derive(Error, Debug)]