diff --git a/crates/caldav/src/calendar/resource.rs b/crates/caldav/src/calendar/resource.rs index fd16cad..eba73aa 100644 --- a/crates/caldav/src/calendar/resource.rs +++ b/crates/caldav/src/calendar/resource.rs @@ -93,7 +93,6 @@ impl DavPushExtension for CalendarResource { } impl Resource for CalendarResource { - type PropName = CalendarPropWrapperName; type Prop = CalendarPropWrapper; type Error = Error; type PrincipalResource = PrincipalResource; @@ -119,7 +118,7 @@ impl Resource for CalendarResource { &self, rmap: &ResourceMap, user: &User, - prop: &Self::PropName, + prop: &CalendarPropWrapperName, ) -> Result { Ok(match prop { CalendarPropWrapperName::Calendar(prop) => CalendarPropWrapper::Calendar(match prop { @@ -230,7 +229,7 @@ impl Resource for CalendarResource { } } - fn remove_prop(&mut self, prop: &Self::PropName) -> Result<(), rustical_dav::Error> { + fn remove_prop(&mut self, prop: &CalendarPropWrapperName) -> Result<(), rustical_dav::Error> { if self.read_only { return Err(rustical_dav::Error::PropReadOnly); } diff --git a/crates/caldav/src/calendar_object/resource.rs b/crates/caldav/src/calendar_object/resource.rs index d7aed71..e5f7770 100644 --- a/crates/caldav/src/calendar_object/resource.rs +++ b/crates/caldav/src/calendar_object/resource.rs @@ -52,7 +52,6 @@ pub struct CalendarObjectResource { } impl Resource for CalendarObjectResource { - type PropName = CalendarObjectPropWrapperName; type Prop = CalendarObjectPropWrapper; type Error = Error; type PrincipalResource = PrincipalResource; @@ -65,7 +64,7 @@ impl Resource for CalendarObjectResource { &self, rmap: &ResourceMap, user: &User, - prop: &Self::PropName, + prop: &CalendarObjectPropWrapperName, ) -> Result { Ok(match prop { CalendarObjectPropWrapperName::CalendarObject(prop) => { diff --git a/crates/caldav/src/calendar_set/mod.rs b/crates/caldav/src/calendar_set/mod.rs index 33edf19..bbd1918 100644 --- a/crates/caldav/src/calendar_set/mod.rs +++ b/crates/caldav/src/calendar_set/mod.rs @@ -24,7 +24,6 @@ pub enum PrincipalPropWrapper { } impl Resource for CalendarSetResource { - type PropName = PrincipalPropWrapperName; type Prop = PrincipalPropWrapper; type Error = Error; type PrincipalResource = PrincipalResource; @@ -40,7 +39,7 @@ impl Resource for CalendarSetResource { &self, rmap: &ResourceMap, user: &User, - prop: &Self::PropName, + prop: &PrincipalPropWrapperName, ) -> Result { Ok(match prop { PrincipalPropWrapperName::Common(prop) => PrincipalPropWrapper::Common( diff --git a/crates/caldav/src/principal/mod.rs b/crates/caldav/src/principal/mod.rs index 81b5793..bb419b7 100644 --- a/crates/caldav/src/principal/mod.rs +++ b/crates/caldav/src/principal/mod.rs @@ -59,7 +59,6 @@ impl NamedRoute for PrincipalResource { } impl Resource for PrincipalResource { - type PropName = PrincipalPropWrapperName; type Prop = PrincipalPropWrapper; type Error = Error; type PrincipalResource = PrincipalResource; @@ -75,7 +74,7 @@ impl Resource for PrincipalResource { &self, rmap: &ResourceMap, user: &User, - prop: &Self::PropName, + prop: &PrincipalPropWrapperName, ) -> Result { let principal_url = Self::get_url(rmap, vec![&self.principal]).unwrap(); let home_set = CalendarHomeSet( diff --git a/crates/carddav/src/address_object/resource.rs b/crates/carddav/src/address_object/resource.rs index 631b808..aec88d3 100644 --- a/crates/carddav/src/address_object/resource.rs +++ b/crates/carddav/src/address_object/resource.rs @@ -48,7 +48,6 @@ pub struct AddressObjectResource { } impl Resource for AddressObjectResource { - type PropName = AddressObjectPropWrapperName; type Prop = AddressObjectPropWrapper; type Error = Error; type PrincipalResource = PrincipalResource; @@ -61,7 +60,7 @@ impl Resource for AddressObjectResource { &self, rmap: &ResourceMap, user: &User, - prop: &Self::PropName, + prop: &AddressObjectPropWrapperName, ) -> Result { Ok(match prop { AddressObjectPropWrapperName::AddressObject(prop) => { diff --git a/crates/carddav/src/addressbook/resource.rs b/crates/carddav/src/addressbook/resource.rs index 6ce8172..54dc685 100644 --- a/crates/carddav/src/addressbook/resource.rs +++ b/crates/carddav/src/addressbook/resource.rs @@ -81,7 +81,6 @@ impl DavPushExtension for AddressbookResource { } impl Resource for AddressbookResource { - type PropName = AddressbookPropWrapperName; type Prop = AddressbookPropWrapper; type Error = Error; type PrincipalResource = PrincipalResource; @@ -97,7 +96,7 @@ impl Resource for AddressbookResource { &self, rmap: &ResourceMap, user: &User, - prop: &Self::PropName, + prop: &AddressbookPropWrapperName, ) -> Result { Ok(match prop { AddressbookPropWrapperName::Addressbook(prop) => { @@ -153,7 +152,10 @@ impl Resource for AddressbookResource { } } - fn remove_prop(&mut self, prop: &Self::PropName) -> Result<(), rustical_dav::Error> { + fn remove_prop( + &mut self, + prop: &AddressbookPropWrapperName, + ) -> Result<(), rustical_dav::Error> { match prop { AddressbookPropWrapperName::Addressbook(prop) => match prop { AddressbookPropName::Displayname => { diff --git a/crates/carddav/src/principal/mod.rs b/crates/carddav/src/principal/mod.rs index 1ba29c4..d20610c 100644 --- a/crates/carddav/src/principal/mod.rs +++ b/crates/carddav/src/principal/mod.rs @@ -64,7 +64,6 @@ impl NamedRoute for PrincipalResource { } impl Resource for PrincipalResource { - type PropName = PrincipalPropWrapperName; type Prop = PrincipalPropWrapper; type Error = Error; type PrincipalResource = PrincipalResource; @@ -80,7 +79,7 @@ impl Resource for PrincipalResource { &self, rmap: &ResourceMap, user: &User, - prop: &Self::PropName, + prop: &PrincipalPropWrapperName, ) -> Result { let principal_href = HrefElement::new(Self::get_principal_url(rmap, &self.principal)); diff --git a/crates/dav/src/resource/methods/proppatch.rs b/crates/dav/src/resource/methods/proppatch.rs index 66fd75d..0579bb4 100644 --- a/crates/dav/src/resource/methods/proppatch.rs +++ b/crates/dav/src/resource/methods/proppatch.rs @@ -11,6 +11,7 @@ use actix_web::{web::Path, HttpRequest}; use itertools::Itertools; use quick_xml::name::Namespace; use rustical_store::auth::User; +use rustical_xml::EnumUnitVariants; use rustical_xml::Unparsed; use rustical_xml::XmlDeserialize; use rustical_xml::XmlDocument; @@ -97,7 +98,7 @@ pub(crate) async fn route_proppatch( }) => { match property { SetPropertyPropWrapper::Valid(prop) => { - let propname: ::PropName = prop.clone().into(); + let propname: <::Prop as EnumUnitVariants>::UnitVariants = prop.clone().into(); let (ns, propname): (Option, &str) = propname.into(); match resource.set_prop(prop) { Ok(()) => props_ok.push((ns, propname.to_owned())), @@ -127,7 +128,9 @@ pub(crate) async fn route_proppatch( } Operation::Remove(remove_el) => { let propname = remove_el.prop.0 .0; - match <::PropName as FromStr>::from_str(&propname) { + match <::Prop as EnumUnitVariants>::UnitVariants::from_str( + &propname, + ) { Ok(prop) => match resource.remove_prop(&prop) { Ok(()) => props_ok.push((None, propname)), Err(Error::PropReadOnly) => props_conflict.push((None, propname)), diff --git a/crates/dav/src/resource/mod.rs b/crates/dav/src/resource/mod.rs index 02ff5c0..a5f4bd0 100644 --- a/crates/dav/src/resource/mod.rs +++ b/crates/dav/src/resource/mod.rs @@ -9,7 +9,7 @@ use itertools::Itertools; use quick_xml::name::Namespace; pub use resource_service::ResourceService; use rustical_store::auth::User; -use rustical_xml::{EnumVariants, XmlDeserialize, XmlSerialize}; +use rustical_xml::{EnumUnitVariants, EnumVariants, XmlDeserialize, XmlSerialize}; use std::str::FromStr; mod methods; @@ -24,10 +24,7 @@ pub trait ResourcePropName: FromStr {} impl ResourcePropName for T {} pub trait Resource: Clone + 'static { - type PropName: ResourcePropName - + From - + Into<(Option>, &'static str)>; - type Prop: ResourceProp + PartialEq + Clone + EnumVariants; + type Prop: ResourceProp + PartialEq + Clone + EnumVariants + EnumUnitVariants; type Error: ResponseError + From; type PrincipalResource: Resource + NamedRoute; @@ -41,14 +38,17 @@ pub trait Resource: Clone + 'static { &self, rmap: &ResourceMap, user: &User, - prop: &Self::PropName, + prop: &::UnitVariants, ) -> Result; fn set_prop(&mut self, _prop: Self::Prop) -> Result<(), crate::Error> { Err(crate::Error::PropReadOnly) } - fn remove_prop(&mut self, _prop: &Self::PropName) -> Result<(), crate::Error> { + fn remove_prop( + &mut self, + _prop: &::UnitVariants, + ) -> Result<(), crate::Error> { Err(crate::Error::PropReadOnly) } @@ -106,7 +106,7 @@ pub trait Resource: Clone + 'static { let mut valid_props = vec![]; let mut invalid_props = vec![]; for prop in props { - if let Ok(valid_prop) = Self::PropName::from_str(prop) { + if let Ok(valid_prop) = ::UnitVariants::from_str(prop) { valid_props.push(valid_prop); } else { invalid_props.push(prop.to_string()) diff --git a/crates/dav/src/resources/root.rs b/crates/dav/src/resources/root.rs index ebef506..deed6ab 100644 --- a/crates/dav/src/resources/root.rs +++ b/crates/dav/src/resources/root.rs @@ -19,7 +19,6 @@ impl Default for RootResource { } impl Resource for RootResource { - type PropName = CommonPropertiesPropName; type Prop = CommonPropertiesProp; type Error = PR::Error; type PrincipalResource = PR; @@ -35,7 +34,7 @@ impl Resource for RootResource { &self, rmap: &ResourceMap, user: &User, - prop: &Self::PropName, + prop: &CommonPropertiesPropName, ) -> Result { CommonPropertiesExtension::get_prop(self, rmap, user, prop) } diff --git a/crates/xml/src/lib.rs b/crates/xml/src/lib.rs index 9eca8cf..d55f6b0 100644 --- a/crates/xml/src/lib.rs +++ b/crates/xml/src/lib.rs @@ -1,5 +1,6 @@ use quick_xml::name::Namespace; use std::collections::HashMap; +use std::str::FromStr; pub mod de; mod error; @@ -34,6 +35,6 @@ pub trait EnumVariants { fn variant_names() -> Vec<(Option>, &'static str)>; } -pub trait EnumUnitVariants { - type UnitVariants; +pub trait EnumUnitVariants: Sized { + type UnitVariants: Into<(Option>, &'static str)> + From + FromStr; }