From 5c6f63a5f3b2c863698fa3bca80473c23e1b7fdc Mon Sep 17 00:00:00 2001 From: Lennart <18233294+lennart-k@users.noreply.github.com> Date: Wed, 31 Dec 2025 12:25:35 +0100 Subject: [PATCH] carddav addressbook: Add supported-collation-set --- crates/carddav/src/addressbook/prop.rs | 28 ++++++++++++++++++- crates/carddav/src/addressbook/resource.rs | 6 ++++ ...rddav__addressbook__tests__propfind-2.snap | 17 +++++++++++ ...rddav__addressbook__tests__propfind-3.snap | 5 ++++ 4 files changed, 55 insertions(+), 1 deletion(-) diff --git a/crates/carddav/src/addressbook/prop.rs b/crates/carddav/src/addressbook/prop.rs index 898b01c..cfb236d 100644 --- a/crates/carddav/src/addressbook/prop.rs +++ b/crates/carddav/src/addressbook/prop.rs @@ -1,6 +1,7 @@ +use derive_more::{From, Into}; use rustical_dav::{ extensions::{CommonPropertiesProp, SyncTokenExtensionProp}, - xml::SupportedReportSet, + xml::{SupportedReportSet, TextCollation}, }; use rustical_dav_push::DavPushExtensionProp; use rustical_xml::{EnumVariants, PropName, XmlDeserialize, XmlSerialize}; @@ -14,6 +15,8 @@ pub enum AddressbookProp { AddressbookDescription(Option), #[xml(ns = "rustical_dav::namespace::NS_CARDDAV", skip_deserializing)] SupportedAddressData(SupportedAddressData), + #[xml(ns = "rustical_dav::namespace::NS_CARDDAV", skip_deserializing)] + SupportedCollationSet(SupportedCollationSet), #[xml(ns = "rustical_dav::namespace::NS_DAV", skip_deserializing)] SupportedReportSet(SupportedReportSet), #[xml(ns = "rustical_dav::namespace::NS_DAV")] @@ -60,6 +63,29 @@ impl Default for SupportedAddressData { } } +#[derive(Debug, Clone, XmlSerialize, XmlDeserialize, PartialEq, Eq, From, Into)] +pub struct SupportedCollation(#[xml(ty = "text")] pub TextCollation); + +#[derive(Debug, Clone, XmlSerialize, XmlDeserialize, PartialEq, Eq)] +pub struct SupportedCollationSet( + #[xml( + ns = "rustical_dav::namespace::NS_CARDDAV", + flatten, + rename = "supported-collation" + )] + pub Vec, +); + +impl Default for SupportedCollationSet { + fn default() -> Self { + Self(vec![ + SupportedCollation(TextCollation::AsciiCasemap), + SupportedCollation(TextCollation::UnicodeCasemap), + SupportedCollation(TextCollation::Octet), + ]) + } +} + #[derive(Debug, Clone, XmlSerialize, PartialEq, Eq, VariantArray)] pub enum ReportMethod { #[xml(ns = "rustical_dav::namespace::NS_CARDDAV")] diff --git a/crates/carddav/src/addressbook/resource.rs b/crates/carddav/src/addressbook/resource.rs index 94ca550..301665b 100644 --- a/crates/carddav/src/addressbook/resource.rs +++ b/crates/carddav/src/addressbook/resource.rs @@ -2,6 +2,7 @@ use super::prop::SupportedAddressData; use crate::Error; use crate::addressbook::prop::{ AddressbookProp, AddressbookPropName, AddressbookPropWrapper, AddressbookPropWrapperName, + SupportedCollationSet, }; use derive_more::derive::{From, Into}; use rustical_dav::extensions::{CommonPropertiesExtension, SyncTokenExtension}; @@ -62,6 +63,9 @@ impl Resource for AddressbookResource { AddressbookPropName::MaxResourceSize => { AddressbookProp::MaxResourceSize(10_000_000) } + AddressbookPropName::SupportedCollationSet => { + AddressbookProp::SupportedCollationSet(SupportedCollationSet::default()) + } AddressbookPropName::SupportedReportSet => { AddressbookProp::SupportedReportSet(SupportedReportSet::all()) } @@ -94,6 +98,7 @@ impl Resource for AddressbookResource { Ok(()) } AddressbookProp::MaxResourceSize(_) + | AddressbookProp::SupportedCollationSet(_) | AddressbookProp::SupportedReportSet(_) | AddressbookProp::SupportedAddressData(_) => { Err(rustical_dav::Error::PropReadOnly) @@ -116,6 +121,7 @@ impl Resource for AddressbookResource { Ok(()) } AddressbookPropName::MaxResourceSize + | AddressbookPropName::SupportedCollationSet | AddressbookPropName::SupportedReportSet | AddressbookPropName::SupportedAddressData => { Err(rustical_dav::Error::PropReadOnly) diff --git a/crates/carddav/src/addressbook/snapshots/rustical_carddav__addressbook__tests__propfind-2.snap b/crates/carddav/src/addressbook/snapshots/rustical_carddav__addressbook__tests__propfind-2.snap index 93499b2..5d9ebbc 100644 --- a/crates/carddav/src/addressbook/snapshots/rustical_carddav__addressbook__tests__propfind-2.snap +++ b/crates/carddav/src/addressbook/snapshots/rustical_carddav__addressbook__tests__propfind-2.snap @@ -31,6 +31,23 @@ ResponseElement { }, ), ), + Addressbook( + SupportedCollationSet( + SupportedCollationSet( + [ + SupportedCollation( + AsciiCasemap, + ), + SupportedCollation( + UnicodeCasemap, + ), + SupportedCollation( + Octet, + ), + ], + ), + ), + ), Addressbook( SupportedReportSet( SupportedReportSet { diff --git a/crates/carddav/src/addressbook/snapshots/rustical_carddav__addressbook__tests__propfind-3.snap b/crates/carddav/src/addressbook/snapshots/rustical_carddav__addressbook__tests__propfind-3.snap index c75aa3b..a76413f 100644 --- a/crates/carddav/src/addressbook/snapshots/rustical_carddav__addressbook__tests__propfind-3.snap +++ b/crates/carddav/src/addressbook/snapshots/rustical_carddav__addressbook__tests__propfind-3.snap @@ -11,6 +11,11 @@ expression: response.serialize_to_string().unwrap() + + i;ascii-casemap + i;unicode-casemap + i;octet +