From a14544527726f396fab6193f93a0c35d52d14c57 Mon Sep 17 00:00:00 2001 From: Lennart <18233294+lennart-k@users.noreply.github.com> Date: Thu, 14 Mar 2024 16:55:46 +0100 Subject: [PATCH] Replacing garbage code with less garbage code :) --- crates/caldav/src/lib.rs | 1 - crates/caldav/src/proptypes.rs | 39 ------------------- crates/caldav/src/resources/calendar.rs | 49 ++++++++++-------------- crates/caldav/src/resources/event.rs | 17 +++++--- crates/caldav/src/resources/principal.rs | 33 ++++++---------- 5 files changed, 45 insertions(+), 94 deletions(-) delete mode 100644 crates/caldav/src/proptypes.rs diff --git a/crates/caldav/src/lib.rs b/crates/caldav/src/lib.rs index 0feb0e2..6b8f775 100644 --- a/crates/caldav/src/lib.rs +++ b/crates/caldav/src/lib.rs @@ -15,7 +15,6 @@ use std::sync::Arc; use tokio::sync::RwLock; pub mod error; -pub mod proptypes; pub mod resources; pub mod routes; pub mod tagname; diff --git a/crates/caldav/src/proptypes.rs b/crates/caldav/src/proptypes.rs deleted file mode 100644 index 8757796..0000000 --- a/crates/caldav/src/proptypes.rs +++ /dev/null @@ -1,39 +0,0 @@ -use std::io::Write; - -use quick_xml::{events::BytesText, Writer}; - -pub fn write_string_prop<'a, W: Write>( - writer: &'a mut Writer, - propname: &'a str, - value: &str, -) -> Result<&'a mut Writer, quick_xml::Error> { - let el = writer.create_element(propname); - if value.is_empty() { - el.write_empty() - } else { - el.write_text_content(BytesText::new(value)) - } -} - -pub fn write_href_prop<'a, W: Write>( - writer: &'a mut Writer, - propname: &'a str, - href: &str, -) -> Result<&'a mut Writer, quick_xml::Error> { - write_hrefs_prop(writer, propname, vec![href]) -} - -pub fn write_hrefs_prop<'a, W: Write>( - writer: &'a mut Writer, - propname: &'a str, - hrefs: Vec<&str>, -) -> Result<&'a mut Writer, quick_xml::Error> { - writer - .create_element(propname) - .write_inner_content(|writer| { - for href in hrefs { - write_string_prop(writer, "href", href)?; - } - Ok(()) - }) -} diff --git a/crates/caldav/src/resources/calendar.rs b/crates/caldav/src/resources/calendar.rs index 8369dda..b8ef03a 100644 --- a/crates/caldav/src/resources/calendar.rs +++ b/crates/caldav/src/resources/calendar.rs @@ -3,17 +3,17 @@ use std::{io::Write, sync::Arc}; use actix_web::{web::Data, HttpRequest}; use anyhow::{anyhow, Result}; use async_trait::async_trait; -use quick_xml::{events::BytesText, Writer}; +use quick_xml::Writer; use rustical_auth::AuthInfo; use rustical_store::calendar::{Calendar, CalendarStore}; use strum::{EnumProperty, EnumString, IntoStaticStr, VariantNames}; use tokio::sync::RwLock; -use crate::{ - proptypes::{write_href_prop, write_string_prop}, - tagname::TagName, +use crate::tagname::TagName; +use rustical_dav::{ + resource::Resource, + xml_snippets::{write_resourcetype, HrefElement, TextElement}, }; -use rustical_dav::{resource::Resource, xml_snippets::write_resourcetype}; pub struct CalendarResource { pub cal_store: Arc>, @@ -87,35 +87,22 @@ impl Resource for CalendarResource { write_resourcetype(writer, vec!["C:calendar", "collection"])? } CalendarProp::CurrentUserPrincipal | CalendarProp::Owner => { - write_href_prop( - writer, + writer.write_serializable( prop.tagname(), - &format!("{}/{}/", self.prefix, self.principal), + &HrefElement::new(format!("{}/{}/", self.prefix, self.principal)), )?; } CalendarProp::Displayname => { - let el = writer.create_element(prop.tagname()); - if let Some(name) = self.calendar.clone().name { - el.write_text_content(BytesText::new(&name))?; - } else { - el.write_empty()?; - } + let name = self.calendar.name.clone(); + writer.write_serializable(prop.tagname(), &TextElement(name))?; } CalendarProp::CalendarColor => { - let el = writer.create_element(prop.tagname()); - if let Some(color) = self.calendar.clone().color { - el.write_text_content(BytesText::new(&color))?; - } else { - el.write_empty()?; - } + let color = self.calendar.color.clone(); + writer.write_serializable(prop.tagname(), &TextElement(color))?; } CalendarProp::CalendarDescription => { - let el = writer.create_element(prop.tagname()); - if let Some(description) = self.calendar.clone().description { - el.write_text_content(BytesText::new(&description))?; - } else { - el.write_empty()?; - } + let description = self.calendar.description.clone(); + writer.write_serializable(prop.tagname(), &TextElement(description))?; } CalendarProp::SupportedCalendarComponentSet => { writer @@ -144,10 +131,16 @@ impl Resource for CalendarResource { })?; } CalendarProp::Getcontenttype => { - write_string_prop(writer, prop.tagname(), "text/calendar")?; + writer.write_serializable( + prop.tagname(), + &TextElement(Some("text/calendar".to_owned())), + )?; } CalendarProp::MaxResourceSize => { - write_string_prop(writer, prop.tagname(), "10000000")?; + writer.write_serializable( + prop.tagname(), + &TextElement(Some("10000000".to_owned())), + )?; } CalendarProp::CurrentUserPrivilegeSet => { writer diff --git a/crates/caldav/src/resources/event.rs b/crates/caldav/src/resources/event.rs index 6882938..29cd0ca 100644 --- a/crates/caldav/src/resources/event.rs +++ b/crates/caldav/src/resources/event.rs @@ -1,9 +1,9 @@ -use crate::{proptypes::write_string_prop, tagname::TagName}; +use crate::tagname::TagName; use actix_web::{web::Data, HttpRequest}; use anyhow::{anyhow, Result}; use async_trait::async_trait; use rustical_auth::AuthInfo; -use rustical_dav::resource::Resource; +use rustical_dav::{resource::Resource, xml_snippets::TextElement}; use rustical_store::calendar::CalendarStore; use rustical_store::event::Event; use std::sync::Arc; @@ -69,13 +69,20 @@ impl Resource for EventResource { ) -> Result<()> { match prop { EventProp::Getetag => { - write_string_prop(writer, prop.tagname(), &self.event.get_etag())?; + writer.write_serializable( + prop.tagname(), + &TextElement(Some(self.event.get_etag())), + )?; } EventProp::CalendarData => { - write_string_prop(writer, prop.tagname(), &self.event.get_ics())?; + writer + .write_serializable(prop.tagname(), &TextElement(Some(self.event.get_ics())))?; } EventProp::Getcontenttype => { - write_string_prop(writer, prop.tagname(), "text/calendar;charset=utf-8")?; + writer.write_serializable( + prop.tagname(), + &TextElement(Some("text/calendar;charset=utf-8".to_owned())), + )?; } }; Ok(()) diff --git a/crates/caldav/src/resources/principal.rs b/crates/caldav/src/resources/principal.rs index 604ab6f..36ddb57 100644 --- a/crates/caldav/src/resources/principal.rs +++ b/crates/caldav/src/resources/principal.rs @@ -1,10 +1,12 @@ -use crate::{proptypes::write_href_prop, tagname::TagName}; +use crate::tagname::TagName; use actix_web::{web::Data, HttpRequest}; use anyhow::{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 rustical_dav::{ + resource::Resource, + xml_snippets::{write_resourcetype, HrefElement}, +}; use rustical_store::calendar::CalendarStore; use std::sync::Arc; use strum::{EnumProperty, EnumString, IntoStaticStr, VariantNames}; @@ -91,26 +93,15 @@ impl Resource for PrincipalCalendarsResource { PrincipalProp::Resourcetype => { write_resourcetype(writer, vec!["principal", "collection"])? } - PrincipalProp::CurrentUserPrincipal | PrincipalProp::PrincipalUrl => { - write_href_prop( - writer, - prop.into(), - &format!("{}/{}/", self.prefix, self.principal), + PrincipalProp::CurrentUserPrincipal + | PrincipalProp::PrincipalUrl + | PrincipalProp::CalendarHomeSet + | PrincipalProp::CalendarUserAddressSet => { + writer.write_serializable( + prop.tagname(), + &HrefElement::new(format!("{}/{}/", self.prefix, self.principal)), )?; } - PrincipalProp::CalendarHomeSet | PrincipalProp::CalendarUserAddressSet => { - writer - .create_element(prop.tagname()) - .write_inner_content(|writer| { - writer - .create_element("href") - .write_text_content(BytesText::new(&format!( - "{}/{}/", - self.prefix, self.principal - )))?; - Ok::<(), quick_xml::Error>(()) - })?; - } }; Ok(()) }