diff --git a/crates/caldav/src/lib.rs b/crates/caldav/src/lib.rs index 0a15a17..b1a8f4a 100644 --- a/crates/caldav/src/lib.rs +++ b/crates/caldav/src/lib.rs @@ -22,8 +22,11 @@ pub use error::Error; pub struct CalDavPrincipalUri(&'static str); impl PrincipalUri for CalDavPrincipalUri { + fn principal_collection(&self) -> String { + format!("{}/principal/", self.0) + } fn principal_uri(&self, principal: &str) -> String { - format!("{}/principal/{}/", self.0, principal) + format!("{}{}/", self.principal_collection(), principal) } } diff --git a/crates/caldav/src/principal/mod.rs b/crates/caldav/src/principal/mod.rs index 69bf843..5077a4d 100644 --- a/crates/caldav/src/principal/mod.rs +++ b/crates/caldav/src/principal/mod.rs @@ -74,6 +74,11 @@ impl Resource for PrincipalResource { )) } PrincipalPropName::AlternateUriSet => PrincipalProp::AlternateUriSet, + PrincipalPropName::PrincipalCollectionSet => { + PrincipalProp::PrincipalCollectionSet(PrincipalCollectionSet( + puri.principal_collection().into(), + )) + } }) } PrincipalPropWrapperName::Common(prop) => PrincipalPropWrapper::Common( diff --git a/crates/caldav/src/principal/prop.rs b/crates/caldav/src/principal/prop.rs index fa3043a..f62eb29 100644 --- a/crates/caldav/src/principal/prop.rs +++ b/crates/caldav/src/principal/prop.rs @@ -18,6 +18,8 @@ pub enum PrincipalProp { GroupMembership(GroupMembership), #[xml(ns = "rustical_dav::namespace::NS_DAV", rename = b"alternate-URI-set")] AlternateUriSet, + #[xml(ns = "rustical_dav::namespace::NS_DAV")] + PrincipalCollectionSet(PrincipalCollectionSet), // CalDAV (RFC 4791) #[xml(ns = "rustical_dav::namespace::NS_CALDAV")] @@ -36,3 +38,6 @@ pub struct CalendarHomeSet(#[xml(ty = "untagged", flatten)] pub(super) Vec); + +#[derive(XmlDeserialize, XmlSerialize, PartialEq, Clone)] +pub struct PrincipalCollectionSet(#[xml(ty = "untagged")] pub(super) HrefElement); diff --git a/crates/carddav/src/lib.rs b/crates/carddav/src/lib.rs index 43d75b7..5cfbc5f 100644 --- a/crates/carddav/src/lib.rs +++ b/crates/carddav/src/lib.rs @@ -22,8 +22,11 @@ pub mod principal; pub struct CardDavPrincipalUri(&'static str); impl PrincipalUri for CardDavPrincipalUri { + fn principal_collection(&self) -> String { + format!("{}/principal/", self.0) + } fn principal_uri(&self, principal: &str) -> String { - format!("{}/principal/{}/", self.0, principal) + format!("{}{}/", self.principal_collection(), principal) } } diff --git a/crates/carddav/src/principal/mod.rs b/crates/carddav/src/principal/mod.rs index c12f319..bae54e3 100644 --- a/crates/carddav/src/principal/mod.rs +++ b/crates/carddav/src/principal/mod.rs @@ -70,6 +70,11 @@ impl Resource for PrincipalResource { )) } PrincipalPropName::AlternateUriSet => PrincipalProp::AlternateUriSet, + PrincipalPropName::PrincipalCollectionSet => { + PrincipalProp::PrincipalCollectionSet(PrincipalCollectionSet( + puri.principal_collection().into(), + )) + } }) } diff --git a/crates/carddav/src/principal/prop.rs b/crates/carddav/src/principal/prop.rs index 3a6d968..6929a26 100644 --- a/crates/carddav/src/principal/prop.rs +++ b/crates/carddav/src/principal/prop.rs @@ -1,9 +1,6 @@ use rustical_dav::{extensions::CommonPropertiesProp, xml::HrefElement}; use rustical_xml::{EnumVariants, PropName, XmlDeserialize, XmlSerialize}; -#[derive(XmlDeserialize, XmlSerialize, PartialEq, Clone)] -pub struct AddressbookHomeSet(#[xml(ty = "untagged", flatten)] pub(super) Vec); - #[derive(XmlDeserialize, XmlSerialize, PartialEq, Clone, EnumVariants, PropName)] #[xml(unit_variants_ident = "PrincipalPropName")] pub enum PrincipalProp { @@ -15,6 +12,8 @@ pub enum PrincipalProp { GroupMembership(GroupMembership), #[xml(ns = "rustical_dav::namespace::NS_DAV", rename = b"alternate-URI-set")] AlternateUriSet, + #[xml(ns = "rustical_dav::namespace::NS_DAV")] + PrincipalCollectionSet(PrincipalCollectionSet), // CardDAV (RFC 6352) #[xml(ns = "rustical_dav::namespace::NS_CARDDAV")] @@ -30,5 +29,11 @@ pub enum PrincipalPropWrapper { Common(CommonPropertiesProp), } +#[derive(XmlDeserialize, XmlSerialize, PartialEq, Clone)] +pub struct AddressbookHomeSet(#[xml(ty = "untagged", flatten)] pub(super) Vec); + #[derive(XmlDeserialize, XmlSerialize, PartialEq, Clone)] pub struct GroupMembership(#[xml(ty = "untagged", flatten)] pub(super) Vec); + +#[derive(XmlDeserialize, XmlSerialize, PartialEq, Clone)] +pub struct PrincipalCollectionSet(#[xml(ty = "untagged")] pub(super) HrefElement); diff --git a/crates/dav/src/resource/principal_uri.rs b/crates/dav/src/resource/principal_uri.rs index fe3c1b2..5c1845f 100644 --- a/crates/dav/src/resource/principal_uri.rs +++ b/crates/dav/src/resource/principal_uri.rs @@ -1,3 +1,4 @@ pub trait PrincipalUri: 'static + Clone + Send + Sync { + fn principal_collection(&self) -> String; fn principal_uri(&self, principal: &str) -> String; }