From 40c86247033e6bbc9a0433992eb2db92e49f3018 Mon Sep 17 00:00:00 2001 From: Lennart <18233294+lennart-k@users.noreply.github.com> Date: Wed, 1 Jan 2025 15:22:51 +0100 Subject: [PATCH] some refactoring --- crates/caldav/src/calendar/prop.rs | 13 ++++- crates/caldav/src/calendar/resource.rs | 26 +++------- crates/caldav/src/calendar_object/resource.rs | 6 +-- crates/carddav/src/address_object/resource.rs | 6 +-- crates/carddav/src/addressbook/prop.rs | 51 ++++++++----------- crates/carddav/src/addressbook/resource.rs | 12 ++--- 6 files changed, 49 insertions(+), 65 deletions(-) diff --git a/crates/caldav/src/calendar/prop.rs b/crates/caldav/src/calendar/prop.rs index 54aff13..a007a4d 100644 --- a/crates/caldav/src/calendar/prop.rs +++ b/crates/caldav/src/calendar/prop.rs @@ -1,9 +1,10 @@ +use derive_more::derive::From; use rustical_xml::{XmlDeserialize, XmlSerialize}; -#[derive(Debug, Clone, XmlDeserialize, XmlSerialize, PartialEq)] +#[derive(Debug, Clone, XmlDeserialize, XmlSerialize, PartialEq, From)] pub struct SupportedCalendarComponent { #[xml(ty = "attr")] - pub name: String, + pub name: &'static str, } #[derive(Debug, Clone, XmlDeserialize, XmlSerialize, PartialEq)] @@ -12,6 +13,14 @@ pub struct SupportedCalendarComponentSet { pub comp: Vec, } +impl Default for SupportedCalendarComponentSet { + fn default() -> Self { + Self { + comp: vec!["VEVENT".into(), "VTODO".into(), "VJOURNAL".into()], + } + } +} + #[derive(Debug, Clone, XmlSerialize, PartialEq)] pub struct CalendarData { #[xml(ty = "attr")] diff --git a/crates/caldav/src/calendar/resource.rs b/crates/caldav/src/calendar/resource.rs index dc9075a..249f8e2 100644 --- a/crates/caldav/src/calendar/resource.rs +++ b/crates/caldav/src/calendar/resource.rs @@ -41,8 +41,8 @@ pub enum CalendarProp { // WebDAV (RFC 2518) #[xml(ns = "rustical_dav::namespace::NS_DAV")] Displayname(Option), - #[xml(ns = "rustical_dav::namespace::NS_DAV")] - Getcontenttype(String), + #[xml(ns = "rustical_dav::namespace::NS_DAV", skip_deserializing)] + Getcontenttype(&'static str), // WebDav Push // NOTE: Here we implement an older version of the spec since the new property name is not reflected @@ -62,11 +62,9 @@ pub enum CalendarProp { CalendarTimezone(Option), #[xml(ns = "rustical_dav::namespace::NS_ICAL")] CalendarOrder(Option), - // TODO: Re-add - #[xml(ns = "rustical_dav::namespace::NS_CALDAV")] + #[xml(ns = "rustical_dav::namespace::NS_CALDAV", skip_deserializing)] SupportedCalendarComponentSet(SupportedCalendarComponentSet), - #[xml(skip_deserializing)] - #[xml(ns = "rustical_dav::namespace::NS_CALDAV")] + #[xml(ns = "rustical_dav::namespace::NS_CALDAV", skip_deserializing)] SupportedCalendarData(SupportedCalendarData), #[xml(ns = "rustical_dav::namespace::NS_DAV")] MaxResourceSize(i64), @@ -119,25 +117,13 @@ impl Resource for CalendarResource { } CalendarPropName::CalendarOrder => CalendarProp::CalendarOrder(Some(self.0.order)), CalendarPropName::SupportedCalendarComponentSet => { - CalendarProp::SupportedCalendarComponentSet(SupportedCalendarComponentSet { - comp: vec![ - SupportedCalendarComponent { - name: "VEVENT".to_owned(), - }, - SupportedCalendarComponent { - name: "VTODO".to_owned(), - }, - SupportedCalendarComponent { - name: "VJOURNAL".to_owned(), - }, - ], - }) + CalendarProp::SupportedCalendarComponentSet(SupportedCalendarComponentSet::default()) } CalendarPropName::SupportedCalendarData => { CalendarProp::SupportedCalendarData(SupportedCalendarData::default()) } CalendarPropName::Getcontenttype => { - CalendarProp::Getcontenttype("text/calendar;charset=utf-8".to_owned()) + CalendarProp::Getcontenttype("text/calendar;charset=utf-8") } CalendarPropName::Transports => CalendarProp::Transports(Default::default()), CalendarPropName::Topic => { diff --git a/crates/caldav/src/calendar_object/resource.rs b/crates/caldav/src/calendar_object/resource.rs index a089660..c6d1611 100644 --- a/crates/caldav/src/calendar_object/resource.rs +++ b/crates/caldav/src/calendar_object/resource.rs @@ -30,8 +30,8 @@ pub enum CalendarObjectProp { // WebDAV (RFC 2518) #[xml(ns = "rustical_dav::namespace::NS_DAV")] Getetag(String), - #[xml(ns = "rustical_dav::namespace::NS_DAV")] - Getcontenttype(String), + #[xml(ns = "rustical_dav::namespace::NS_DAV", skip_deserializing)] + Getcontenttype(&'static str), // CalDAV (RFC 4791) #[xml(ns = "rustical_dav::namespace::NS_CALDAV")] @@ -66,7 +66,7 @@ impl Resource for CalendarObjectResource { CalendarObjectProp::CalendarData(self.object.get_ics().to_owned()) } CalendarObjectPropName::Getcontenttype => { - CalendarObjectProp::Getcontenttype("text/calendar;charset=utf-8".to_owned()) + CalendarObjectProp::Getcontenttype("text/calendar;charset=utf-8") } }) } diff --git a/crates/carddav/src/address_object/resource.rs b/crates/carddav/src/address_object/resource.rs index a6ae9d6..0257e7b 100644 --- a/crates/carddav/src/address_object/resource.rs +++ b/crates/carddav/src/address_object/resource.rs @@ -31,8 +31,8 @@ pub enum AddressObjectProp { // WebDAV (RFC 2518) #[xml(ns = "rustical_dav::namespace::NS_DAV")] Getetag(String), - #[xml(ns = "rustical_dav::namespace::NS_DAV")] - Getcontenttype(String), + #[xml(ns = "rustical_dav::namespace::NS_DAV", skip_deserializing)] + Getcontenttype(&'static str), // CalDAV (RFC 4791) #[xml(ns = "rustical_dav::namespace::NS_CARDDAV")] @@ -67,7 +67,7 @@ impl Resource for AddressObjectResource { AddressObjectProp::AddressData(self.object.get_vcf().to_owned()) } AddressObjectPropName::Getcontenttype => { - AddressObjectProp::Getcontenttype("text/vcard;charset=utf-8".to_owned()) + AddressObjectProp::Getcontenttype("text/vcard;charset=utf-8") } }) } diff --git a/crates/carddav/src/addressbook/prop.rs b/crates/carddav/src/addressbook/prop.rs index 6cfcbe7..1ae6d59 100644 --- a/crates/carddav/src/addressbook/prop.rs +++ b/crates/carddav/src/addressbook/prop.rs @@ -3,29 +3,28 @@ use rustical_xml::XmlSerialize; #[derive(Debug, Clone, XmlSerialize, PartialEq)] pub struct AddressDataType { #[xml(ty = "attr")] - pub content_type: String, + pub content_type: &'static str, #[xml(ty = "attr")] - pub version: String, + pub version: &'static str, } #[derive(Debug, Clone, XmlSerialize, PartialEq)] pub struct SupportedAddressData { - // #[serde(rename = "CARD:address-data-type", alias = "address-data-type")] - #[xml(flatten)] - address_data_type: Vec, + #[xml(ns = "rustical_dav::namespace::NS_CARDDAV", flatten)] + address_data_type: &'static [AddressDataType], } impl Default for SupportedAddressData { fn default() -> Self { Self { - address_data_type: vec![ + address_data_type: &[ AddressDataType { - content_type: "text/vcard".to_owned(), - version: "3.0".to_owned(), + content_type: "text/vcard", + version: "3.0", }, AddressDataType { - content_type: "text/vcard".to_owned(), - version: "4.0".to_owned(), + content_type: "text/vcard", + version: "4.0", }, ], } @@ -34,42 +33,34 @@ impl Default for SupportedAddressData { #[derive(Debug, Clone, XmlSerialize, PartialEq)] pub enum ReportMethod { + #[xml(ns = "rustical_dav::namespace::NS_CARDDAV")] AddressbookMultiget, SyncCollection, } -#[derive(Debug, Clone, XmlSerialize, PartialEq)] -pub struct ReportWrapper { - #[xml(ty = "untagged")] - report: ReportMethod, -} - #[derive(Debug, Clone, XmlSerialize, PartialEq)] pub struct SupportedReportWrapper { - report: ReportWrapper, -} - -impl From for SupportedReportWrapper { - fn from(value: ReportMethod) -> Self { - Self { - report: ReportWrapper { report: value }, - } - } + #[xml(ns = "rustical_dav::namespace::NS_CARDDAV")] + report: ReportMethod, } // RFC 3253 section-3.1.5 #[derive(Debug, Clone, XmlSerialize, PartialEq)] pub struct SupportedReportSet { - #[xml(flatten)] - supported_report: Vec, + #[xml(ns = "rustical_dav::namespace::NS_CARDDAV", flatten)] + supported_report: &'static [SupportedReportWrapper], } impl Default for SupportedReportSet { fn default() -> Self { Self { - supported_report: vec![ - ReportMethod::AddressbookMultiget.into(), - ReportMethod::SyncCollection.into(), + supported_report: &[ + SupportedReportWrapper { + report: ReportMethod::AddressbookMultiget, + }, + SupportedReportWrapper { + report: ReportMethod::SyncCollection, + }, ], } } diff --git a/crates/carddav/src/addressbook/resource.rs b/crates/carddav/src/addressbook/resource.rs index 18ec7a0..b93cad3 100644 --- a/crates/carddav/src/addressbook/resource.rs +++ b/crates/carddav/src/addressbook/resource.rs @@ -35,17 +35,15 @@ pub enum AddressbookProp { // WebDAV (RFC 2518) #[xml(ns = "rustical_dav::namespace::NS_DAV")] Displayname(Option), - #[xml(ns = "rustical_dav::namespace::NS_DAV")] - Getcontenttype(String), + #[xml(ns = "rustical_dav::namespace::NS_DAV", skip_deserializing)] + Getcontenttype(&'static str), // CardDAV (RFC 6352) #[xml(ns = "rustical_dav::namespace::NS_CARDDAV")] AddressbookDescription(Option), - #[xml(skip_deserializing)] - #[xml(ns = "rustical_dav::namespace::NS_CARDDAV")] + #[xml(ns = "rustical_dav::namespace::NS_CARDDAV", skip_deserializing)] SupportedAddressData(SupportedAddressData), - #[xml(skip_deserializing)] - #[xml(ns = "rustical_dav::namespace::NS_CARDDAV")] + #[xml(ns = "rustical_dav::namespace::NS_CARDDAV", skip_deserializing)] SupportedReportSet(SupportedReportSet), #[xml(ns = "rustical_dav::namespace::NS_DAV")] MaxResourceSize(i64), @@ -83,7 +81,7 @@ impl Resource for AddressbookResource { AddressbookProp::Displayname(self.0.displayname.clone()) } AddressbookPropName::Getcontenttype => { - AddressbookProp::Getcontenttype("text/vcard;charset=utf-8".to_owned()) + AddressbookProp::Getcontenttype("text/vcard;charset=utf-8") } AddressbookPropName::MaxResourceSize => AddressbookProp::MaxResourceSize(10000000), AddressbookPropName::SupportedReportSet => {