From 782d8863025fb1470cf1e0d7a5a820b5ff4470c6 Mon Sep 17 00:00:00 2001 From: Lennart <18233294+lennart-k@users.noreply.github.com> Date: Mon, 4 Nov 2024 19:49:09 +0100 Subject: [PATCH] remove boxed extensions --- crates/carddav/src/principal/mod.rs | 3 +- crates/dav/src/extension.rs | 80 +++-------------------------- crates/dav/src/resource/mod.rs | 15 ++---- crates/dav/src/resources/root.rs | 23 ++++----- 4 files changed, 22 insertions(+), 99 deletions(-) diff --git a/crates/carddav/src/principal/mod.rs b/crates/carddav/src/principal/mod.rs index 5670409..e91a39b 100644 --- a/crates/carddav/src/principal/mod.rs +++ b/crates/carddav/src/principal/mod.rs @@ -5,8 +5,7 @@ use actix_web::web::Data; use actix_web::HttpRequest; use async_trait::async_trait; use derive_more::derive::{From, TryInto}; -use rustical_dav::extension::BoxedExtension; -use rustical_dav::extensions::{CommonPropertiesExtension, CommonPropertiesProp}; +use rustical_dav::extensions::CommonPropertiesProp; use rustical_dav::privileges::UserPrivilegeSet; use rustical_dav::resource::{InvalidProperty, Resource, ResourceService}; use rustical_dav::xml::HrefElement; diff --git a/crates/dav/src/extension.rs b/crates/dav/src/extension.rs index 131392d..4b92546 100644 --- a/crates/dav/src/extension.rs +++ b/crates/dav/src/extension.rs @@ -1,16 +1,15 @@ use crate::resource::{Resource, ResourceProp, ResourcePropName}; use actix_web::dev::ResourceMap; -use derive_more::derive::Deref; use rustical_store::auth::User; use std::str::FromStr; use strum::VariantNames; pub trait ResourceExtension: Clone { type PropName: ResourcePropName; - type Prop: ResourceProp; + type Prop: ResourceProp + Into; type Error: Into + From; - fn list_props() -> &'static [&'static str] { + fn list_props(&self) -> &'static [&'static str] { Self::PropName::VARIANTS } @@ -22,55 +21,6 @@ pub trait ResourceExtension: Clone { prop: Self::PropName, ) -> Result; - fn remove_prop(&mut self, _prop: &Self::PropName) -> Result<(), Self::Error> { - Err(crate::Error::PropReadOnly.into()) - } -} - -pub struct ResourceExtensionWrapper; - -pub trait BoxableExtension { - fn get_prop( - &self, - resource: &R, - rmap: &ResourceMap, - user: &User, - prop: &str, - ) -> Result, R::Error>; - - fn propfind<'a>( - &self, - resource: &R, - props: Vec<&'a str>, - user: &User, - rmap: &ResourceMap, - ) -> Result<(Vec<&'a str>, Vec), R::Error>; - - fn list_props(&self) -> &'static [&'static str]; -} - -impl, Error: Into>> - BoxableExtension for RE -{ - fn get_prop( - &self, - resource: &R, - rmap: &ResourceMap, - user: &User, - prop: &str, - // prop: ::PropName, - ) -> Result, R::Error> { - let prop: RE::PropName = if let Ok(prop) = prop.parse() { - prop - } else { - return Ok(None); - }; - - let prop = ResourceExtension::::get_prop(self, resource, rmap, user, prop) - .map_err(RE::Error::into)?; - Ok(Some(prop.into())) - } - fn propfind<'a>( &self, resource: &R, @@ -78,42 +28,28 @@ impl, Error: Into Result<(Vec<&'a str>, Vec), R::Error> { - let (valid_props, invalid_props): (Vec>, Vec>) = props + let (valid_props, invalid_props): (Vec>, Vec>) = props .into_iter() .map(|prop| { - if let Ok(valid_prop) = RE::PropName::from_str(prop) { + if let Ok(valid_prop) = Self::PropName::from_str(prop) { (Some(valid_prop), None) } else { (None, Some(prop)) } }) .unzip(); - let valid_props: Vec = valid_props.into_iter().flatten().collect(); + let valid_props: Vec = valid_props.into_iter().flatten().collect(); let invalid_props: Vec<&str> = invalid_props.into_iter().flatten().collect(); let prop_responses = valid_props .into_iter() - .map(|prop| self.get_prop(resource, rmap, user, prop)) - .collect::, RE::Error>>() - .map_err(RE::Error::into)? + .map(|prop| >::get_prop(self, resource, rmap, user, prop)) + .collect::, Self::Error>>() + .map_err(Self::Error::into)? .into_iter() .map(|prop| prop.into()) .collect::>(); Ok((invalid_props, prop_responses)) } - - fn list_props(&self) -> &'static [&'static str] { - Self::list_props() - } -} - -#[derive(Deref)] -pub struct BoxedExtension(Box>); - -impl BoxedExtension { - pub fn from_ext> + 'static>(ext: RE) -> Self { - let boxed_ext: Box> = Box::new(ext); - BoxedExtension(boxed_ext) - } } diff --git a/crates/dav/src/resource/mod.rs b/crates/dav/src/resource/mod.rs index 7679c58..a77cfb1 100644 --- a/crates/dav/src/resource/mod.rs +++ b/crates/dav/src/resource/mod.rs @@ -1,4 +1,4 @@ -use crate::extension::{BoxableExtension, BoxedExtension}; +use crate::extension::ResourceExtension; use crate::extensions::{CommonPropertiesExtension, CommonPropertiesProp}; use crate::methods::{route_delete, route_propfind, route_proppatch}; use crate::privileges::UserPrivilegeSet; @@ -37,19 +37,12 @@ pub trait Resource: Clone + 'static { type PrincipalResource: Resource; type ResourceType: Default + Serialize + for<'de> Deserialize<'de>; - fn list_extensions() -> Vec> { - vec![BoxedExtension::from_ext( - CommonPropertiesExtension::::default(), - )] + fn list_extensions() -> Vec> { + vec![CommonPropertiesExtension::default()] } fn list_props() -> Vec<&'static str> { - Self::PropName::VARIANTS - .iter() - .map(|&prop| prop) - // Bodge, since VariantNames somehow includes Ext... props despite the strum(disabled) flag - .filter(|prop| !prop.starts_with("ext-")) - .collect() + Self::PropName::VARIANTS.iter().map(|&prop| prop).collect() } fn get_prop( diff --git a/crates/dav/src/resources/root.rs b/crates/dav/src/resources/root.rs index 58275e6..6e2dd0d 100644 --- a/crates/dav/src/resources/root.rs +++ b/crates/dav/src/resources/root.rs @@ -1,10 +1,4 @@ -use std::any::type_name; -use std::marker::PhantomData; - -use crate::extension::BoxedExtension; -use crate::extensions::{ - CommonPropertiesExtension, CommonPropertiesProp, CommonPropertiesPropName, -}; +use crate::extensions::CommonPropertiesProp; use crate::privileges::UserPrivilegeSet; use crate::resource::{Resource, ResourceService}; use actix_web::dev::ResourceMap; @@ -12,6 +6,9 @@ use actix_web::HttpRequest; use async_trait::async_trait; use rustical_store::auth::User; use serde::{Deserialize, Serialize}; +use std::any::type_name; +use std::marker::PhantomData; +use strum::{EnumString, VariantNames}; #[derive(Deserialize, Serialize, Default, Debug)] #[serde(rename_all = "kebab-case")] @@ -28,19 +25,17 @@ impl Default for RootResource { } } +#[derive(EnumString, VariantNames, Clone)] +#[strum(serialize_all = "kebab-case")] +pub enum RootResourcePropName {} + impl Resource for RootResource { - type PropName = CommonPropertiesPropName; + type PropName = RootResourcePropName; type Prop = CommonPropertiesProp; type Error = PR::Error; type ResourceType = Resourcetype; type PrincipalResource = PR; - fn list_extensions() -> Vec> { - vec![BoxedExtension::from_ext( - CommonPropertiesExtension::::default(), - )] - } - fn get_prop( &self, _rmap: &ResourceMap,