Group some DAV properties in extensions

This commit is contained in:
Lennart
2025-01-18 22:23:56 +01:00
parent 8d7574290c
commit 1dda9dea8d
6 changed files with 326 additions and 198 deletions

View File

@@ -0,0 +1,37 @@
use crate::push::Transports;
use rustical_xml::{EnumUnitVariants, EnumVariants, XmlDeserialize, XmlSerialize};
#[derive(XmlDeserialize, XmlSerialize, PartialEq, Clone, EnumUnitVariants, EnumVariants)]
#[xml(unit_variants_ident = "DavPushExtensionPropName")]
pub enum DavPushExtensionProp {
// WebDav Push
#[xml(skip_deserializing)]
#[xml(ns = "crate::namespace::NS_DAVPUSH")]
Transports(Transports),
#[xml(ns = "crate::namespace::NS_DAVPUSH")]
Topic(String),
}
pub trait DavPushExtension {
fn get_topic(&self) -> String;
fn get_prop(
&self,
prop: &DavPushExtensionPropName,
) -> Result<DavPushExtensionProp, crate::Error> {
Ok(match &prop {
DavPushExtensionPropName::Transports => {
DavPushExtensionProp::Transports(Default::default())
}
DavPushExtensionPropName::Topic => DavPushExtensionProp::Topic(self.get_topic()),
})
}
fn set_prop(&self, _prop: DavPushExtensionProp) -> Result<(), crate::Error> {
Err(crate::Error::PropReadOnly)
}
fn remove_prop(&self, _prop: &DavPushExtensionPropName) -> Result<(), crate::Error> {
Err(crate::Error::PropReadOnly)
}
}

View File

@@ -0,0 +1,5 @@
mod davpush;
mod synctoken;
pub use davpush::*;
pub use synctoken::*;

View File

@@ -0,0 +1,39 @@
use rustical_xml::{EnumUnitVariants, EnumVariants, XmlDeserialize, XmlSerialize};
#[derive(XmlDeserialize, XmlSerialize, PartialEq, Clone, EnumUnitVariants, EnumVariants)]
#[xml(unit_variants_ident = "SyncTokenExtensionPropName")]
pub enum SyncTokenExtensionProp {
// Collection Synchronization (RFC 6578)
#[xml(ns = "crate::namespace::NS_DAV")]
SyncToken(String),
// CalendarServer
#[xml(ns = "crate::namespace::NS_CALENDARSERVER")]
Getctag(String),
}
pub trait SyncTokenExtension {
fn get_synctoken(&self) -> String;
fn get_prop(
&self,
prop: &SyncTokenExtensionPropName,
) -> Result<SyncTokenExtensionProp, crate::Error> {
Ok(match &prop {
SyncTokenExtensionPropName::SyncToken => {
SyncTokenExtensionProp::SyncToken(self.get_synctoken())
}
SyncTokenExtensionPropName::Getctag => {
SyncTokenExtensionProp::Getctag(self.get_synctoken())
}
})
}
fn set_prop(&self, _prop: SyncTokenExtensionProp) -> Result<(), crate::Error> {
Err(crate::Error::PropReadOnly)
}
fn remove_prop(&self, _prop: &SyncTokenExtensionPropName) -> Result<(), crate::Error> {
Err(crate::Error::PropReadOnly)
}
}