diff --git a/crates/carddav/src/principal/mod.rs b/crates/carddav/src/principal/mod.rs index 0f0fdf2..39daa7f 100644 --- a/crates/carddav/src/principal/mod.rs +++ b/crates/carddav/src/principal/mod.rs @@ -53,7 +53,13 @@ impl Resource for PrincipalResource { PrincipalPropWrapper::Principal(match prop { PrincipalPropName::PrincipalUrl => PrincipalProp::PrincipalUrl(principal_href), PrincipalPropName::AddressbookHomeSet => { - PrincipalProp::AddressbookHomeSet(principal_href) + PrincipalProp::AddressbookHomeSet(AddressbookHomeSet( + self.principal + .memberships() + .iter() + .map(|principal| puri.principal_uri(principal).into()) + .collect(), + )) } PrincipalPropName::PrincipalAddress => PrincipalProp::PrincipalAddress(None), PrincipalPropName::GroupMembership => { diff --git a/crates/carddav/src/principal/prop.rs b/crates/carddav/src/principal/prop.rs index b1d83e5..ebe68e8 100644 --- a/crates/carddav/src/principal/prop.rs +++ b/crates/carddav/src/principal/prop.rs @@ -22,11 +22,14 @@ 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), } +#[derive(XmlDeserialize, XmlSerialize, PartialEq, Clone)] +pub struct AddressbookHomeSet(#[xml(ty = "untagged", flatten)] pub Vec); + #[derive(XmlDeserialize, XmlSerialize, PartialEq, Clone, EnumVariants, PropName)] #[xml(unit_variants_ident = "PrincipalPropWrapperName", untagged)] pub enum PrincipalPropWrapper {