diff --git a/crates/carddav/src/principal/mod.rs b/crates/carddav/src/principal/mod.rs index 6901b13..1aba8f0 100644 --- a/crates/carddav/src/principal/mod.rs +++ b/crates/carddav/src/principal/mod.rs @@ -26,6 +26,9 @@ pub struct PrincipalResource { principal: String, } +#[derive(XmlDeserialize, XmlSerialize, PartialEq, Clone)] +pub struct AddressbookHomeSet(#[xml(ty = "untagged", flatten)] Vec); + #[derive(XmlDeserialize, XmlSerialize, PartialEq, Clone, EnumVariants, EnumUnitVariants)] #[xml(unit_variants_ident = "PrincipalPropName")] pub enum PrincipalProp { @@ -39,7 +42,7 @@ pub enum PrincipalProp { // CardDAV (RFC 6352) #[xml(ns = "rustical_dav::namespace::NS_CARDDAV")] - AddressbookHomeSet(HrefElement), + AddressbookHomeSet(AddressbookHomeSet), #[xml(ns = "rustical_dav::namespace::NS_CARDDAV")] PrincipalAddress(Option), } @@ -83,6 +86,14 @@ impl Resource for PrincipalResource { ) -> Result { let principal_href = HrefElement::new(Self::get_principal_url(rmap, &self.principal)); + let home_set = AddressbookHomeSet( + user.memberships() + .into_iter() + .map(|principal| Self::get_url(rmap, vec![principal]).unwrap()) + .map(HrefElement::new) + .collect(), + ); + Ok(match prop { PrincipalPropWrapperName::Principal(prop) => { PrincipalPropWrapper::Principal(match prop { @@ -91,7 +102,7 @@ impl Resource for PrincipalResource { } PrincipalPropName::PrincipalUrl => PrincipalProp::PrincipalUrl(principal_href), PrincipalPropName::AddressbookHomeSet => { - PrincipalProp::AddressbookHomeSet(principal_href) + PrincipalProp::AddressbookHomeSet(home_set) } PrincipalPropName::PrincipalAddress => PrincipalProp::PrincipalAddress(None), })