diff options
author | Quentin Dufour <quentin@deuxfleurs.fr> | 2024-05-23 10:01:43 +0200 |
---|---|---|
committer | Quentin Dufour <quentin@deuxfleurs.fr> | 2024-05-23 10:01:43 +0200 |
commit | ff823a10f049e06c711537560ba10f3dc826afcd (patch) | |
tree | 25000784fef0758b7aad1990d3d14ecbe7eae46d /aero-proto/src/dav/controller.rs | |
parent | 7687065bfc824127fda657363894a30268e95385 (diff) | |
download | aerogramme-ff823a10f049e06c711537560ba10f3dc826afcd.tar.gz aerogramme-ff823a10f049e06c711537560ba10f3dc826afcd.zip |
improve ical date parsing
Diffstat (limited to 'aero-proto/src/dav/controller.rs')
-rw-r--r-- | aero-proto/src/dav/controller.rs | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/aero-proto/src/dav/controller.rs b/aero-proto/src/dav/controller.rs index 0a47cf4..4cf520e 100644 --- a/aero-proto/src/dav/controller.rs +++ b/aero-proto/src/dav/controller.rs @@ -380,6 +380,22 @@ fn apply_filter<'a>( }) } +fn ical_parse_date(dt: &str) -> Option<chrono::DateTime<chrono::Utc>> { + tracing::trace!(raw_time = dt, "VEVENT raw time"); + let tmpl = match dt.chars().last() { + Some('Z') => cal::UTC_DATETIME_FMT, + Some(_) => { + tracing::warn!(raw_time=dt, "floating datetime is not properly supported yet"); + cal::FLOATING_DATETIME_FMT + }, + None => return None + }; + + NaiveDateTime::parse_from_str(dt, tmpl) + .ok() + .map(|v| v.and_utc()) +} + fn prop_date( properties: &[icalendar::parser::Property], name: &str, @@ -388,12 +404,7 @@ fn prop_date( .iter() .find(|candidate| candidate.name.as_str() == name) .map(|p| p.val.as_str()) - .map(|raw_time| { - tracing::trace!(raw_time = raw_time, "VEVENT raw time"); - NaiveDateTime::parse_from_str(raw_time, cal::ICAL_DATETIME_FMT) - .ok() - .map(|v| v.and_utc()) - }) + .map(ical_parse_date) .flatten() } @@ -412,12 +423,7 @@ fn is_properties_match(props: &[icalendar::parser::Property], filters: &[cal::Pr // check value match &pattern.time_or_text { Some(cal::TimeOrText::Time(time_range)) => { - let maybe_parsed_date = NaiveDateTime::parse_from_str( - prop.val.as_str(), - cal::ICAL_DATETIME_FMT, - ) - .ok() - .map(|v| v.and_utc()); + let maybe_parsed_date = ical_parse_date(prop.val.as_str()); let parsed_date = match maybe_parsed_date { None => return false, |