WIP: Complete work of propfind parsing

This commit is contained in:
Lennart
2025-06-04 18:11:25 +02:00
parent 5ad6ee2e99
commit e57a14cad1
43 changed files with 875 additions and 1036 deletions

View File

@@ -17,9 +17,7 @@ rustical_xml.workspace = true
ical.workspace = true
lazy_static.workspace = true
regex.workspace = true
strum.workspace = true
strum_macros.workspace = true
rrule = "0.14"
rrule.workspace = true
serde.workspace = true
sha2.workspace = true
actix-web = { workspace = true, optional = true }

View File

@@ -1,6 +1,6 @@
use crate::Error;
use crate::{CalDateTime, ComponentMut, parse_duration};
use chrono::{DateTime, Duration};
use chrono::{DateTime, Duration, Utc};
use ical::{
generator::IcalEvent,
parser::{Component, ical::component::IcalTimeZone},
@@ -89,8 +89,18 @@ impl EventObject {
Ok(Some(rrule_set))
}
pub fn expand_recurrence(&self) -> Result<Vec<IcalEvent>, Error> {
if let Some(rrule_set) = self.recurrence_ruleset()? {
pub fn expand_recurrence(
&self,
start: Option<DateTime<Utc>>,
end: Option<DateTime<Utc>>,
) -> Result<Vec<IcalEvent>, Error> {
if let Some(mut rrule_set) = self.recurrence_ruleset()? {
if let Some(start) = start {
rrule_set = rrule_set.after(start.with_timezone(&rrule::Tz::UTC));
}
if let Some(end) = end {
rrule_set = rrule_set.before(end.with_timezone(&rrule::Tz::UTC));
}
let mut events = vec![];
let dates = rrule_set.all(2048).dates;
@@ -205,7 +215,7 @@ END:VEVENT\r\n",
let event = event.event().unwrap();
let events: Vec<String> = event
.expand_recurrence()
.expand_recurrence(None, None)
.unwrap()
.into_iter()
.map(|event| Emitter::generate(&event))

View File

@@ -1,6 +1,8 @@
use super::{EventObject, JournalObject, TodoObject};
use crate::CalDateTime;
use crate::Error;
use chrono::DateTime;
use chrono::Utc;
use ical::{
generator::{Emitter, IcalCalendar},
parser::{Component, ical::component::IcalTimeZone},
@@ -188,12 +190,16 @@ impl CalendarObject {
}
}
pub fn expand_recurrence(&self) -> Result<String, Error> {
pub fn expand_recurrence(
&self,
start: Option<DateTime<Utc>>,
end: Option<DateTime<Utc>>,
) -> Result<String, Error> {
// Only events can be expanded
match &self.data {
CalendarObjectComponent::Event(event) => {
let mut cal = self.cal.clone();
cal.events = event.expand_recurrence()?;
cal.events = event.expand_recurrence(start, end)?;
Ok(cal.generate())
}
_ => Ok(self.get_ics().to_string()),

View File

@@ -38,7 +38,7 @@ pub enum CalDateTimeError {
InvalidDurationFormat(String),
}
#[derive(Debug, Clone, Deref, PartialEq)]
#[derive(Debug, Clone, Deref, PartialEq, Eq, Hash)]
pub struct UtcDateTime(pub DateTime<Utc>);
impl ValueDeserialize for UtcDateTime {