diff --git a/Cargo.lock b/Cargo.lock index 8b87d84..7c3a4c5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -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" diff --git a/Cargo.toml b/Cargo.toml index 72580d2..f281758 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,3 +14,4 @@ icalendar = { version = "0.15", features = ["chrono-tz"] } serde = { version = "1.0", features = ["derive"] } urlencoding = "2" chrono = "0" +rrule = "0" diff --git a/src/main.rs b/src/main.rs index aa52402..33a210c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -80,10 +80,33 @@ async fn convert(urls: &[&str], days: Option<&String>) -> Result 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(),