From b9ee8506e173c08214818c7b78e0000d76edc1d2 Mon Sep 17 00:00:00 2001 From: Lennart <18233294+lennart-k@users.noreply.github.com> Date: Thu, 14 Mar 2024 16:15:50 +0100 Subject: [PATCH] replace plaintext props with enums --- crates/caldav/src/resources/calendar.rs | 37 ++++++++++++++---------- crates/caldav/src/resources/event.rs | 13 +++++---- crates/caldav/src/resources/principal.rs | 14 ++++----- crates/caldav/src/resources/root.rs | 9 +++--- 4 files changed, 41 insertions(+), 32 deletions(-) diff --git a/crates/caldav/src/resources/calendar.rs b/crates/caldav/src/resources/calendar.rs index 804999c..8369dda 100644 --- a/crates/caldav/src/resources/calendar.rs +++ b/crates/caldav/src/resources/calendar.rs @@ -6,10 +6,13 @@ use async_trait::async_trait; use quick_xml::{events::BytesText, Writer}; use rustical_auth::AuthInfo; use rustical_store::calendar::{Calendar, CalendarStore}; -use strum::{EnumString, IntoStaticStr, VariantNames}; +use strum::{EnumProperty, EnumString, IntoStaticStr, VariantNames}; use tokio::sync::RwLock; -use crate::proptypes::{write_href_prop, write_string_prop}; +use crate::{ + proptypes::{write_href_prop, write_string_prop}, + tagname::TagName, +}; use rustical_dav::{resource::Resource, xml_snippets::write_resourcetype}; pub struct CalendarResource { @@ -20,18 +23,22 @@ pub struct CalendarResource { pub principal: String, } -#[derive(EnumString, Debug, VariantNames, IntoStaticStr)] +#[derive(EnumString, Debug, VariantNames, IntoStaticStr, EnumProperty)] #[strum(serialize_all = "kebab-case")] pub enum CalendarProp { Resourcetype, CurrentUserPrincipal, + Owner, Displayname, + #[strum(props(tagname = "IC:calendar-color"))] + CalendarColor, + #[strum(props(tagname = "C:calendar-description"))] + CalendarDescription, + #[strum(props(tagname = "C:supported-calendar-component-set"))] SupportedCalendarComponentSet, + #[strum(props(tagname = "C:supported-calendar-data"))] SupportedCalendarData, Getcontenttype, - CalendarDescription, - Owner, - CalendarColor, CurrentUserPrivilegeSet, MaxResourceSize, } @@ -82,12 +89,12 @@ impl Resource for CalendarResource { CalendarProp::CurrentUserPrincipal | CalendarProp::Owner => { write_href_prop( writer, - prop.into(), + prop.tagname(), &format!("{}/{}/", self.prefix, self.principal), )?; } CalendarProp::Displayname => { - let el = writer.create_element("displayname"); + let el = writer.create_element(prop.tagname()); if let Some(name) = self.calendar.clone().name { el.write_text_content(BytesText::new(&name))?; } else { @@ -95,7 +102,7 @@ impl Resource for CalendarResource { } } CalendarProp::CalendarColor => { - let el = writer.create_element("IC:calendar-color"); + let el = writer.create_element(prop.tagname()); if let Some(color) = self.calendar.clone().color { el.write_text_content(BytesText::new(&color))?; } else { @@ -103,7 +110,7 @@ impl Resource for CalendarResource { } } CalendarProp::CalendarDescription => { - let el = writer.create_element("C:calendar-description"); + let el = writer.create_element(prop.tagname()); if let Some(description) = self.calendar.clone().description { el.write_text_content(BytesText::new(&description))?; } else { @@ -112,7 +119,7 @@ impl Resource for CalendarResource { } CalendarProp::SupportedCalendarComponentSet => { writer - .create_element("C:supported-calendar-component-set") + .create_element(prop.tagname()) .write_inner_content(|writer| { writer .create_element("C:comp") @@ -123,7 +130,7 @@ impl Resource for CalendarResource { } CalendarProp::SupportedCalendarData => { writer - .create_element("C:supported-calendar-data") + .create_element(prop.tagname()) .write_inner_content(|writer| { // writer @@ -137,14 +144,14 @@ impl Resource for CalendarResource { })?; } CalendarProp::Getcontenttype => { - write_string_prop(writer, "getcontenttype", "text/calendar")?; + write_string_prop(writer, prop.tagname(), "text/calendar")?; } CalendarProp::MaxResourceSize => { - write_string_prop(writer, "max-resource-size", "10000000")?; + write_string_prop(writer, prop.tagname(), "10000000")?; } CalendarProp::CurrentUserPrivilegeSet => { writer - .create_element("current-user-privilege-set") + .create_element(prop.tagname()) // These are just hard-coded for now and will possibly change in the future .write_inner_content(|writer| { for privilege in [ diff --git a/crates/caldav/src/resources/event.rs b/crates/caldav/src/resources/event.rs index c692ba5..6882938 100644 --- a/crates/caldav/src/resources/event.rs +++ b/crates/caldav/src/resources/event.rs @@ -1,4 +1,4 @@ -use crate::proptypes::write_string_prop; +use crate::{proptypes::write_string_prop, tagname::TagName}; use actix_web::{web::Data, HttpRequest}; use anyhow::{anyhow, Result}; use async_trait::async_trait; @@ -7,7 +7,7 @@ use rustical_dav::resource::Resource; use rustical_store::calendar::CalendarStore; use rustical_store::event::Event; use std::sync::Arc; -use strum::{EnumString, VariantNames}; +use strum::{EnumProperty, EnumString, IntoStaticStr, VariantNames}; use tokio::sync::RwLock; pub struct EventResource { @@ -16,10 +16,11 @@ pub struct EventResource { pub event: Event, } -#[derive(EnumString, Debug, VariantNames)] +#[derive(EnumString, Debug, VariantNames, IntoStaticStr, EnumProperty)] #[strum(serialize_all = "kebab-case")] pub enum EventProp { Getetag, + #[strum(props(tagname = "C:calendar-data"))] CalendarData, Getcontenttype, } @@ -68,13 +69,13 @@ impl Resource for EventResource { ) -> Result<()> { match prop { EventProp::Getetag => { - write_string_prop(writer, "getetag", &self.event.get_etag())?; + write_string_prop(writer, prop.tagname(), &self.event.get_etag())?; } EventProp::CalendarData => { - write_string_prop(writer, "C:calendar-data", &self.event.get_ics())?; + write_string_prop(writer, prop.tagname(), &self.event.get_ics())?; } EventProp::Getcontenttype => { - write_string_prop(writer, "getcontenttype", "text/calendar;charset=utf-8")?; + write_string_prop(writer, prop.tagname(), "text/calendar;charset=utf-8")?; } }; Ok(()) diff --git a/crates/caldav/src/resources/principal.rs b/crates/caldav/src/resources/principal.rs index dff564b..604ab6f 100644 --- a/crates/caldav/src/resources/principal.rs +++ b/crates/caldav/src/resources/principal.rs @@ -1,6 +1,4 @@ -use std::sync::Arc; - -use crate::proptypes::write_href_prop; +use crate::{proptypes::write_href_prop, tagname::TagName}; use actix_web::{web::Data, HttpRequest}; use anyhow::{anyhow, Result}; use async_trait::async_trait; @@ -8,7 +6,8 @@ use quick_xml::events::BytesText; use rustical_auth::AuthInfo; use rustical_dav::{resource::Resource, xml_snippets::write_resourcetype}; use rustical_store::calendar::CalendarStore; -use strum::{EnumString, IntoStaticStr, VariantNames}; +use std::sync::Arc; +use strum::{EnumProperty, EnumString, IntoStaticStr, VariantNames}; use tokio::sync::RwLock; use super::calendar::CalendarResource; @@ -20,14 +19,16 @@ pub struct PrincipalCalendarsResource { cal_store: Arc>, } -#[derive(EnumString, Debug, VariantNames, IntoStaticStr)] +#[derive(EnumString, Debug, VariantNames, IntoStaticStr, EnumProperty)] #[strum(serialize_all = "kebab-case")] pub enum PrincipalProp { Resourcetype, CurrentUserPrincipal, #[strum(serialize = "principal-URL")] PrincipalUrl, + #[strum(props(tagname = "C:calendar-home-set"))] CalendarHomeSet, + #[strum(props(tagname = "C:calendar-user-address-set"))] CalendarUserAddressSet, } @@ -98,9 +99,8 @@ impl Resource for PrincipalCalendarsResource { )?; } PrincipalProp::CalendarHomeSet | PrincipalProp::CalendarUserAddressSet => { - let propname: &'static str = prop.into(); writer - .create_element(&format!("C:{propname}")) + .create_element(prop.tagname()) .write_inner_content(|writer| { writer .create_element("href") diff --git a/crates/caldav/src/resources/root.rs b/crates/caldav/src/resources/root.rs index 5451eb8..2d50007 100644 --- a/crates/caldav/src/resources/root.rs +++ b/crates/caldav/src/resources/root.rs @@ -1,10 +1,11 @@ +use crate::tagname::TagName; use actix_web::HttpRequest; -use anyhow::{anyhow, Result}; +use anyhow::Result; use async_trait::async_trait; use quick_xml::events::BytesText; use rustical_auth::AuthInfo; use rustical_dav::{resource::Resource, xml_snippets::write_resourcetype}; -use strum::{EnumString, VariantNames}; +use strum::{EnumProperty, EnumString, IntoStaticStr, VariantNames}; pub struct RootResource { prefix: String, @@ -12,7 +13,7 @@ pub struct RootResource { path: String, } -#[derive(EnumString, Debug, VariantNames)] +#[derive(EnumString, Debug, VariantNames, EnumProperty, IntoStaticStr)] #[strum(serialize_all = "kebab-case")] pub enum RootProp { Resourcetype, @@ -55,7 +56,7 @@ impl Resource for RootResource { RootProp::Resourcetype => write_resourcetype(writer, vec!["collection"])?, RootProp::CurrentUserPrincipal => { writer - .create_element("current-user-principal") + .create_element(prop.tagname()) .write_inner_content(|writer| { writer .create_element("href")