carddav addressbook: Add supported-collation-set

This commit is contained in:
Lennart
2025-12-31 12:25:35 +01:00
parent 17ba8faef2
commit 5c6f63a5f3
4 changed files with 55 additions and 1 deletions

View File

@@ -1,6 +1,7 @@
use derive_more::{From, Into};
use rustical_dav::{ use rustical_dav::{
extensions::{CommonPropertiesProp, SyncTokenExtensionProp}, extensions::{CommonPropertiesProp, SyncTokenExtensionProp},
xml::SupportedReportSet, xml::{SupportedReportSet, TextCollation},
}; };
use rustical_dav_push::DavPushExtensionProp; use rustical_dav_push::DavPushExtensionProp;
use rustical_xml::{EnumVariants, PropName, XmlDeserialize, XmlSerialize}; use rustical_xml::{EnumVariants, PropName, XmlDeserialize, XmlSerialize};
@@ -14,6 +15,8 @@ pub enum AddressbookProp {
AddressbookDescription(Option<String>), AddressbookDescription(Option<String>),
#[xml(ns = "rustical_dav::namespace::NS_CARDDAV", skip_deserializing)] #[xml(ns = "rustical_dav::namespace::NS_CARDDAV", skip_deserializing)]
SupportedAddressData(SupportedAddressData), SupportedAddressData(SupportedAddressData),
#[xml(ns = "rustical_dav::namespace::NS_CARDDAV", skip_deserializing)]
SupportedCollationSet(SupportedCollationSet),
#[xml(ns = "rustical_dav::namespace::NS_DAV", skip_deserializing)] #[xml(ns = "rustical_dav::namespace::NS_DAV", skip_deserializing)]
SupportedReportSet(SupportedReportSet<ReportMethod>), SupportedReportSet(SupportedReportSet<ReportMethod>),
#[xml(ns = "rustical_dav::namespace::NS_DAV")] #[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<SupportedCollation>,
);
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)] #[derive(Debug, Clone, XmlSerialize, PartialEq, Eq, VariantArray)]
pub enum ReportMethod { pub enum ReportMethod {
#[xml(ns = "rustical_dav::namespace::NS_CARDDAV")] #[xml(ns = "rustical_dav::namespace::NS_CARDDAV")]

View File

@@ -2,6 +2,7 @@ use super::prop::SupportedAddressData;
use crate::Error; use crate::Error;
use crate::addressbook::prop::{ use crate::addressbook::prop::{
AddressbookProp, AddressbookPropName, AddressbookPropWrapper, AddressbookPropWrapperName, AddressbookProp, AddressbookPropName, AddressbookPropWrapper, AddressbookPropWrapperName,
SupportedCollationSet,
}; };
use derive_more::derive::{From, Into}; use derive_more::derive::{From, Into};
use rustical_dav::extensions::{CommonPropertiesExtension, SyncTokenExtension}; use rustical_dav::extensions::{CommonPropertiesExtension, SyncTokenExtension};
@@ -62,6 +63,9 @@ impl Resource for AddressbookResource {
AddressbookPropName::MaxResourceSize => { AddressbookPropName::MaxResourceSize => {
AddressbookProp::MaxResourceSize(10_000_000) AddressbookProp::MaxResourceSize(10_000_000)
} }
AddressbookPropName::SupportedCollationSet => {
AddressbookProp::SupportedCollationSet(SupportedCollationSet::default())
}
AddressbookPropName::SupportedReportSet => { AddressbookPropName::SupportedReportSet => {
AddressbookProp::SupportedReportSet(SupportedReportSet::all()) AddressbookProp::SupportedReportSet(SupportedReportSet::all())
} }
@@ -94,6 +98,7 @@ impl Resource for AddressbookResource {
Ok(()) Ok(())
} }
AddressbookProp::MaxResourceSize(_) AddressbookProp::MaxResourceSize(_)
| AddressbookProp::SupportedCollationSet(_)
| AddressbookProp::SupportedReportSet(_) | AddressbookProp::SupportedReportSet(_)
| AddressbookProp::SupportedAddressData(_) => { | AddressbookProp::SupportedAddressData(_) => {
Err(rustical_dav::Error::PropReadOnly) Err(rustical_dav::Error::PropReadOnly)
@@ -116,6 +121,7 @@ impl Resource for AddressbookResource {
Ok(()) Ok(())
} }
AddressbookPropName::MaxResourceSize AddressbookPropName::MaxResourceSize
| AddressbookPropName::SupportedCollationSet
| AddressbookPropName::SupportedReportSet | AddressbookPropName::SupportedReportSet
| AddressbookPropName::SupportedAddressData => { | AddressbookPropName::SupportedAddressData => {
Err(rustical_dav::Error::PropReadOnly) Err(rustical_dav::Error::PropReadOnly)

View File

@@ -31,6 +31,23 @@ ResponseElement {
}, },
), ),
), ),
Addressbook(
SupportedCollationSet(
SupportedCollationSet(
[
SupportedCollation(
AsciiCasemap,
),
SupportedCollation(
UnicodeCasemap,
),
SupportedCollation(
Octet,
),
],
),
),
),
Addressbook( Addressbook(
SupportedReportSet( SupportedReportSet(
SupportedReportSet { SupportedReportSet {

View File

@@ -11,6 +11,11 @@ expression: response.serialize_to_string().unwrap()
<address-data-type xmlns="urn:ietf:params:xml:ns:carddav" content-type="text/vcard" version="3.0"/> <address-data-type xmlns="urn:ietf:params:xml:ns:carddav" content-type="text/vcard" version="3.0"/>
<address-data-type xmlns="urn:ietf:params:xml:ns:carddav" content-type="text/vcard" version="4.0"/> <address-data-type xmlns="urn:ietf:params:xml:ns:carddav" content-type="text/vcard" version="4.0"/>
</supported-address-data> </supported-address-data>
<supported-collation-set xmlns="urn:ietf:params:xml:ns:carddav">
<supported-collation xmlns="urn:ietf:params:xml:ns:carddav">i;ascii-casemap</supported-collation>
<supported-collation xmlns="urn:ietf:params:xml:ns:carddav">i;unicode-casemap</supported-collation>
<supported-collation xmlns="urn:ietf:params:xml:ns:carddav">i;octet</supported-collation>
</supported-collation-set>
<supported-report-set xmlns="DAV:"> <supported-report-set xmlns="DAV:">
<supported-report xmlns="DAV:"> <supported-report xmlns="DAV:">
<report xmlns="DAV:"> <report xmlns="DAV:">