Implement rrule parsing

This commit is contained in:
Jan-Henrik 2024-01-09 23:22:53 +01:00
parent a89a0dbd3a
commit e555eb611e
3 changed files with 51 additions and 1 deletions

26
Cargo.lock generated
View file

@ -2,6 +2,15 @@
# It is not intended for manual editing.
version = 3
[[package]]
name = "aho-corasick"
version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0"
dependencies = [
"memchr",
]
[[package]]
name = "android-tzdata"
version = "0.1.1"
@ -480,6 +489,7 @@ dependencies = [
"chrono",
"icalendar",
"reqwest",
"rrule",
"serde",
"tokio",
"urlencoding",
@ -937,6 +947,8 @@ version = "1.8.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d0ab3ca65655bb1e41f2a8c8cd662eb4fb035e67c3f78da1d61dffe89d07300f"
dependencies = [
"aho-corasick",
"memchr",
"regex-syntax",
]
@ -983,6 +995,20 @@ dependencies = [
"winreg",
]
[[package]]
name = "rrule"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "615777991e415d96aa97f6e45e809111911497c029e5d0df7f6d751d218d28e8"
dependencies = [
"chrono",
"chrono-tz",
"lazy_static",
"log",
"regex",
"thiserror",
]
[[package]]
name = "rustix"
version = "0.37.20"

View file

@ -14,3 +14,4 @@ icalendar = { version = "0.15", features = ["chrono-tz"] }
serde = { version = "1.0", features = ["derive"] }
urlencoding = "2"
chrono = "0"
rrule = "0"

View file

@ -80,10 +80,33 @@ async fn convert(urls: &[&str], days: Option<&String>) -> Result<CustomCalendar>
None => start + chrono::Duration::days(1),
};
if start < filter_start || start > filter_end {
let length = end - start;
let start_dates = if let Some(rrule) = event.properties().get("RRULE") {
//let vector = Vec::new();
let rrule_str = rrule.value();
let string = format!("DTSTART:{}\n{}", event.properties().get("DTSTART").unwrap().value(), rrule_str);
let rrule: rrule::RRuleSet = string.parse()?;
let date_set = rrule.all(100).dates;
date_set.iter().map(|x| x.with_timezone(&chrono::Utc)).collect()
} else {
vec!(start)
};
let mut found = false;
for start_date in start_dates {
if start_date >= filter_start && start_date <= filter_end {
found = true;
break;
}
}
if !found {
continue;
}
let end = start + length;
entries.push(CustomCalendarEntry {
title: event.get_summary().unwrap_or("").to_string(),
description: event.get_description().unwrap_or("").to_string(),