diff --git a/crates/caldav/src/calendar/prop.rs b/crates/caldav/src/calendar/prop.rs index d012a09..b4e8488 100644 --- a/crates/caldav/src/calendar/prop.rs +++ b/crates/caldav/src/calendar/prop.rs @@ -1,20 +1,20 @@ use serde::{Deserialize, Serialize}; -#[derive(Debug, Clone, Deserialize, Serialize)] +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)] #[serde(rename_all = "kebab-case")] pub struct SupportedCalendarComponent { #[serde(rename = "@name")] pub name: String, } -#[derive(Debug, Clone, Deserialize, Serialize)] +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)] #[serde(rename_all = "kebab-case")] pub struct SupportedCalendarComponentSet { #[serde(rename = "C:comp")] pub comp: Vec, } -#[derive(Debug, Clone, Deserialize, Serialize)] +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)] #[serde(rename_all = "kebab-case")] pub struct CalendarData { #[serde(rename = "@content-type")] @@ -32,14 +32,14 @@ impl Default for CalendarData { } } -#[derive(Debug, Clone, Deserialize, Serialize, Default)] +#[derive(Debug, Clone, Deserialize, Serialize, Default, PartialEq)] #[serde(rename_all = "kebab-case")] pub struct SupportedCalendarData { #[serde(rename = "C:calendar-data", alias = "calendar-data")] calendar_data: CalendarData, } -#[derive(Debug, Clone, Deserialize, Serialize, Default)] +#[derive(Debug, Clone, Deserialize, Serialize, Default, PartialEq)] #[serde(rename_all = "kebab-case")] pub struct Resourcetype { #[serde(rename = "C:calendar", alias = "calendar")] @@ -47,7 +47,7 @@ pub struct Resourcetype { collection: (), } -#[derive(Debug, Clone, Deserialize, Serialize)] +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)] #[serde(rename_all = "kebab-case")] pub enum ReportMethod { CalendarQuery, @@ -55,14 +55,14 @@ pub enum ReportMethod { SyncCollection, } -#[derive(Debug, Clone, Deserialize, Serialize)] +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)] #[serde(rename_all = "kebab-case")] pub struct ReportWrapper { #[serde(rename = "$value")] report: ReportMethod, } -#[derive(Debug, Clone, Deserialize, Serialize)] +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)] #[serde(rename_all = "kebab-case")] pub struct SupportedReportWrapper { report: ReportWrapper, @@ -77,7 +77,7 @@ impl From for SupportedReportWrapper { } // RFC 3253 section-3.1.5 -#[derive(Debug, Clone, Deserialize, Serialize)] +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)] #[serde(rename_all = "kebab-case")] pub struct SupportedReportSet { supported_report: Vec, diff --git a/crates/caldav/src/calendar/resource.rs b/crates/caldav/src/calendar/resource.rs index 2a519a2..ded48b0 100644 --- a/crates/caldav/src/calendar/resource.rs +++ b/crates/caldav/src/calendar/resource.rs @@ -12,10 +12,10 @@ use actix_web::http::Method; use actix_web::web; use actix_web::{web::Data, HttpRequest}; use async_trait::async_trait; -use derive_more::derive::{From, Into, TryInto}; +use derive_more::derive::{From, Into}; use rustical_dav::extensions::CommonPropertiesProp; use rustical_dav::privileges::UserPrivilegeSet; -use rustical_dav::resource::{InvalidProperty, Resource, ResourceService}; +use rustical_dav::resource::{Resource, ResourceService}; use rustical_store::auth::User; use rustical_store::{Calendar, CalendarStore}; use serde::{Deserialize, Serialize}; @@ -47,7 +47,7 @@ pub enum CalendarPropName { Getctag, } -#[derive(Deserialize, Serialize, From, TryInto)] +#[derive(Default, Deserialize, Serialize, From, PartialEq)] #[serde(rename_all = "kebab-case")] pub enum CalendarProp { // WebDAV (RFC 2518) @@ -84,19 +84,13 @@ pub enum CalendarProp { #[serde(skip_deserializing, untagged)] #[from] - #[try_into] ExtCommonProperties(CommonPropertiesProp), #[serde(untagged)] + #[default] Invalid, } -impl InvalidProperty for CalendarProp { - fn invalid_property(&self) -> bool { - matches!(self, Self::Invalid) - } -} - #[derive(Clone, Debug, From, Into)] pub struct CalendarResource(Calendar); diff --git a/crates/caldav/src/calendar_object/resource.rs b/crates/caldav/src/calendar_object/resource.rs index 00c673f..9a485ef 100644 --- a/crates/caldav/src/calendar_object/resource.rs +++ b/crates/caldav/src/calendar_object/resource.rs @@ -2,11 +2,11 @@ use super::methods::{get_event, put_event}; use crate::{principal::PrincipalResource, Error}; use actix_web::{dev::ResourceMap, web::Data, HttpRequest}; use async_trait::async_trait; -use derive_more::derive::{From, Into, TryInto}; +use derive_more::derive::{From, Into}; use rustical_dav::{ extensions::CommonPropertiesProp, privileges::UserPrivilegeSet, - resource::{InvalidProperty, Resource, ResourceService}, + resource::{Resource, ResourceService}, }; use rustical_store::{auth::User, CalendarObject, CalendarStore}; use serde::{Deserialize, Serialize}; @@ -29,7 +29,7 @@ pub enum CalendarObjectPropName { Getcontenttype, } -#[derive(Deserialize, Serialize, From, TryInto)] +#[derive(Default, Deserialize, Serialize, From, PartialEq)] #[serde(rename_all = "kebab-case")] pub enum CalendarObjectProp { // WebDAV (RFC 2518) @@ -42,19 +42,13 @@ pub enum CalendarObjectProp { #[serde(skip_deserializing, untagged)] #[from] - #[try_into] ExtCommonProperties(CommonPropertiesProp), #[serde(untagged)] + #[default] Invalid, } -impl InvalidProperty for CalendarObjectProp { - fn invalid_property(&self) -> bool { - matches!(self, Self::Invalid) - } -} - #[derive(Clone, From, Into)] pub struct CalendarObjectResource { pub object: CalendarObject, @@ -62,7 +56,7 @@ pub struct CalendarObjectResource { } // TODO: set correct resourcetype -#[derive(Debug, Clone, Deserialize, Serialize, Default)] +#[derive(Debug, Clone, Deserialize, Serialize, Default, PartialEq)] #[serde(rename_all = "kebab-case")] pub struct Resourcetype { collection: (), diff --git a/crates/caldav/src/principal/mod.rs b/crates/caldav/src/principal/mod.rs index 3642bac..4dffdce 100644 --- a/crates/caldav/src/principal/mod.rs +++ b/crates/caldav/src/principal/mod.rs @@ -4,10 +4,10 @@ use actix_web::dev::ResourceMap; use actix_web::web::Data; use actix_web::HttpRequest; use async_trait::async_trait; -use derive_more::derive::{From, TryInto}; +use derive_more::derive::From; use rustical_dav::extensions::CommonPropertiesProp; use rustical_dav::privileges::UserPrivilegeSet; -use rustical_dav::resource::{InvalidProperty, Resource, ResourceService}; +use rustical_dav::resource::{Resource, ResourceService}; use rustical_dav::xml::HrefElement; use rustical_store::auth::User; use rustical_store::CalendarStore; @@ -25,14 +25,14 @@ pub struct PrincipalResource { principal: String, } -#[derive(Deserialize, Serialize, Default, Debug)] +#[derive(Deserialize, Serialize, Default, Debug, PartialEq)] #[serde(rename_all = "kebab-case")] pub struct Resourcetype { principal: (), collection: (), } -#[derive(Deserialize, Serialize, From, TryInto)] +#[derive(Default, Deserialize, Serialize, From, PartialEq)] #[serde(rename_all = "kebab-case")] pub enum PrincipalProp { // WebDAV Access Control (RFC 3744) @@ -47,19 +47,13 @@ pub enum PrincipalProp { #[serde(skip_deserializing, untagged)] #[from] - #[try_into] ExtCommonProperties(CommonPropertiesProp), #[serde(untagged)] + #[default] Invalid, } -impl InvalidProperty for PrincipalProp { - fn invalid_property(&self) -> bool { - matches!(self, Self::Invalid) - } -} - #[derive(EnumString, VariantNames, Clone)] #[strum(serialize_all = "kebab-case")] pub enum PrincipalPropName { diff --git a/crates/carddav/src/address_object/resource.rs b/crates/carddav/src/address_object/resource.rs index aad4e17..260a621 100644 --- a/crates/carddav/src/address_object/resource.rs +++ b/crates/carddav/src/address_object/resource.rs @@ -1,11 +1,11 @@ use crate::{principal::PrincipalResource, Error}; use actix_web::{dev::ResourceMap, web::Data, HttpRequest}; use async_trait::async_trait; -use derive_more::derive::{From, Into, TryInto}; +use derive_more::derive::{From, Into}; use rustical_dav::{ extensions::CommonPropertiesProp, privileges::UserPrivilegeSet, - resource::{InvalidProperty, Resource, ResourceService}, + resource::{Resource, ResourceService}, }; use rustical_store::{auth::User, AddressObject, AddressbookStore}; use serde::{Deserialize, Serialize}; @@ -30,7 +30,7 @@ pub enum AddressObjectPropName { Getcontenttype, } -#[derive(Deserialize, Serialize, From, TryInto)] +#[derive(Default, Deserialize, Serialize, From, PartialEq)] #[serde(rename_all = "kebab-case")] pub enum AddressObjectProp { // WebDAV (RFC 2518) @@ -43,19 +43,13 @@ pub enum AddressObjectProp { #[serde(skip_deserializing, untagged)] #[from] - #[try_into] ExtCommonProperties(CommonPropertiesProp), #[serde(untagged)] + #[default] Invalid, } -impl InvalidProperty for AddressObjectProp { - fn invalid_property(&self) -> bool { - matches!(self, Self::Invalid) - } -} - #[derive(Clone, From, Into)] pub struct AddressObjectResource { pub object: AddressObject, @@ -63,7 +57,7 @@ pub struct AddressObjectResource { } // TODO: set correct resourcetype -#[derive(Debug, Clone, Deserialize, Serialize, Default)] +#[derive(Debug, Clone, Deserialize, Serialize, Default, PartialEq)] #[serde(rename_all = "kebab-case")] pub struct Resourcetype { collection: (), diff --git a/crates/carddav/src/addressbook/prop.rs b/crates/carddav/src/addressbook/prop.rs index d876983..3b6c1f8 100644 --- a/crates/carddav/src/addressbook/prop.rs +++ b/crates/carddav/src/addressbook/prop.rs @@ -1,6 +1,6 @@ use serde::{Deserialize, Serialize}; -#[derive(Debug, Clone, Deserialize, Serialize)] +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)] #[serde(rename_all = "kebab-case")] pub struct AddressDataType { #[serde(rename = "@content-type")] @@ -9,7 +9,7 @@ pub struct AddressDataType { pub version: String, } -#[derive(Debug, Clone, Deserialize, Serialize)] +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)] #[serde(rename_all = "kebab-case")] pub struct SupportedAddressData { #[serde(rename = "CARD:address-data-type", alias = "address-data-type")] @@ -33,7 +33,7 @@ impl Default for SupportedAddressData { } } -#[derive(Debug, Clone, Deserialize, Serialize, Default)] +#[derive(Debug, Clone, Deserialize, Serialize, Default, PartialEq)] #[serde(rename_all = "kebab-case")] pub struct Resourcetype { #[serde(rename = "CARD:addressbook", alias = "addressbook")] @@ -41,21 +41,21 @@ pub struct Resourcetype { collection: (), } -#[derive(Debug, Clone, Deserialize, Serialize)] +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)] #[serde(rename_all = "kebab-case")] pub enum ReportMethod { AddressbookMultiget, SyncCollection, } -#[derive(Debug, Clone, Deserialize, Serialize)] +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)] #[serde(rename_all = "kebab-case")] pub struct ReportWrapper { #[serde(rename = "$value")] report: ReportMethod, } -#[derive(Debug, Clone, Deserialize, Serialize)] +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)] #[serde(rename_all = "kebab-case")] pub struct SupportedReportWrapper { report: ReportWrapper, @@ -70,7 +70,7 @@ impl From for SupportedReportWrapper { } // RFC 3253 section-3.1.5 -#[derive(Debug, Clone, Deserialize, Serialize)] +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)] #[serde(rename_all = "kebab-case")] pub struct SupportedReportSet { supported_report: Vec, diff --git a/crates/carddav/src/addressbook/resource.rs b/crates/carddav/src/addressbook/resource.rs index 87366b4..863ce9b 100644 --- a/crates/carddav/src/addressbook/resource.rs +++ b/crates/carddav/src/addressbook/resource.rs @@ -9,10 +9,10 @@ use actix_web::http::Method; use actix_web::web; use actix_web::{web::Data, HttpRequest}; use async_trait::async_trait; -use derive_more::derive::{From, Into, TryInto}; +use derive_more::derive::{From, Into}; use rustical_dav::extensions::CommonPropertiesProp; use rustical_dav::privileges::UserPrivilegeSet; -use rustical_dav::resource::{InvalidProperty, Resource, ResourceService}; +use rustical_dav::resource::{Resource, ResourceService}; use rustical_store::auth::User; use rustical_store::{Addressbook, AddressbookStore}; use serde::{Deserialize, Serialize}; @@ -40,7 +40,7 @@ pub enum AddressbookPropName { Getctag, } -#[derive(Deserialize, Serialize, From, TryInto)] +#[derive(Default, Deserialize, Serialize, From, PartialEq)] #[serde(rename_all = "kebab-case")] pub enum AddressbookProp { // WebDAV (RFC 2518) @@ -69,19 +69,13 @@ pub enum AddressbookProp { #[serde(skip_deserializing, untagged)] #[from] - #[try_into] ExtCommonProperties(CommonPropertiesProp), #[serde(untagged)] + #[default] Invalid, } -impl InvalidProperty for AddressbookProp { - fn invalid_property(&self) -> bool { - matches!(self, Self::Invalid) - } -} - #[derive(Clone, Debug, From, Into)] pub struct AddressbookResource(Addressbook); diff --git a/crates/carddav/src/principal/mod.rs b/crates/carddav/src/principal/mod.rs index e91a39b..3bed1f3 100644 --- a/crates/carddav/src/principal/mod.rs +++ b/crates/carddav/src/principal/mod.rs @@ -4,10 +4,10 @@ use actix_web::dev::ResourceMap; use actix_web::web::Data; use actix_web::HttpRequest; use async_trait::async_trait; -use derive_more::derive::{From, TryInto}; +use derive_more::derive::From; use rustical_dav::extensions::CommonPropertiesProp; use rustical_dav::privileges::UserPrivilegeSet; -use rustical_dav::resource::{InvalidProperty, Resource, ResourceService}; +use rustical_dav::resource::{Resource, ResourceService}; use rustical_dav::xml::HrefElement; use rustical_store::auth::User; use rustical_store::AddressbookStore; @@ -25,14 +25,14 @@ pub struct PrincipalResource { principal: String, } -#[derive(Deserialize, Serialize, Default, Debug)] +#[derive(Deserialize, Serialize, Default, Debug, PartialEq)] #[serde(rename_all = "kebab-case")] pub struct Resourcetype { principal: (), collection: (), } -#[derive(Deserialize, Serialize, From, TryInto)] +#[derive(Default, Deserialize, Serialize, From, PartialEq)] #[serde(rename_all = "kebab-case")] pub enum PrincipalProp { // WebDAV Access Control (RFC 3744) @@ -47,20 +47,14 @@ pub enum PrincipalProp { #[serde(skip_deserializing, untagged)] #[from] - #[try_into] ExtCommonProperties(CommonPropertiesProp), #[serde(untagged)] + #[default] Invalid, } -impl InvalidProperty for PrincipalProp { - fn invalid_property(&self) -> bool { - matches!(self, Self::Invalid) - } -} - -#[derive(EnumString, VariantNames, Clone, From, TryInto)] +#[derive(EnumString, VariantNames, Clone)] #[strum(serialize_all = "kebab-case")] pub enum PrincipalPropName { #[strum(serialize = "principal-URL")] diff --git a/crates/dav/src/extensions/mod.rs b/crates/dav/src/extensions/mod.rs index 05525e1..4d15a2e 100644 --- a/crates/dav/src/extensions/mod.rs +++ b/crates/dav/src/extensions/mod.rs @@ -19,7 +19,7 @@ impl Default for CommonPropertiesExtension { } } -#[derive(Deserialize, Serialize)] +#[derive(Deserialize, Serialize, PartialEq)] #[serde(rename_all = "kebab-case")] pub enum CommonPropertiesProp { // WebDAV (RFC 2518) diff --git a/crates/dav/src/privileges.rs b/crates/dav/src/privileges.rs index d0b15a1..c1a0ea5 100644 --- a/crates/dav/src/privileges.rs +++ b/crates/dav/src/privileges.rs @@ -43,7 +43,7 @@ impl Serialize for UserPrivilegeSet { } // TODO: implement Deserialize once we need it -#[derive(Debug, Clone, Deserialize, Default)] +#[derive(Debug, Clone, Deserialize, Default, PartialEq)] #[serde(rename_all = "kebab-case")] pub struct UserPrivilegeSet { privileges: HashSet, diff --git a/crates/dav/src/resource/mod.rs b/crates/dav/src/resource/mod.rs index a77cfb1..bf40e8e 100644 --- a/crates/dav/src/resource/mod.rs +++ b/crates/dav/src/resource/mod.rs @@ -32,7 +32,7 @@ impl Deserialize<'de>> ResourceType for T {} pub trait Resource: Clone + 'static { type PropName: ResourcePropName; - type Prop: ResourceProp + From>; + type Prop: ResourceProp + From> + PartialEq; type Error: ResponseError + From; type PrincipalResource: Resource; type ResourceType: Default + Serialize + for<'de> Deserialize<'de>; @@ -188,6 +188,12 @@ pub trait InvalidProperty { fn invalid_property(&self) -> bool; } +impl InvalidProperty for T { + fn invalid_property(&self) -> bool { + self == &T::default() + } +} + #[async_trait(?Send)] pub trait ResourceService: Sized + 'static { type MemberType: Resource; diff --git a/crates/dav/src/resources/root.rs b/crates/dav/src/resources/root.rs index 6e2dd0d..0a514f2 100644 --- a/crates/dav/src/resources/root.rs +++ b/crates/dav/src/resources/root.rs @@ -10,7 +10,7 @@ use std::any::type_name; use std::marker::PhantomData; use strum::{EnumString, VariantNames}; -#[derive(Deserialize, Serialize, Default, Debug)] +#[derive(Deserialize, Serialize, Default, Debug, PartialEq)] #[serde(rename_all = "kebab-case")] pub struct Resourcetype { collection: (), diff --git a/crates/dav/src/xml/mod.rs b/crates/dav/src/xml/mod.rs index 6940de7..b4a5fb5 100644 --- a/crates/dav/src/xml/mod.rs +++ b/crates/dav/src/xml/mod.rs @@ -9,7 +9,7 @@ pub use tag_name::TagName; use serde::{Deserialize, Serialize}; -#[derive(Debug, Clone, Deserialize, Serialize, From)] +#[derive(Debug, Clone, Deserialize, Serialize, From, PartialEq)] pub struct HrefElement { pub href: String, }