mirror of
https://github.com/lennart-k/rustical.git
synced 2025-12-14 07:02:24 +00:00
Lots of clippy appeasement
This commit is contained in:
@@ -32,7 +32,6 @@ pub async fn route_get<C: CalendarStore, S: SubscriptionStore>(
|
||||
return Err(crate::Error::Unauthorized);
|
||||
}
|
||||
|
||||
let mut timezones = HashMap::new();
|
||||
let mut vtimezones = HashMap::new();
|
||||
let objects = cal_store.get_objects(&principal, &calendar_id).await?;
|
||||
|
||||
@@ -64,31 +63,23 @@ pub async fn route_get<C: CalendarStore, S: SubscriptionStore>(
|
||||
for object in &objects {
|
||||
vtimezones.extend(object.get_vtimezones());
|
||||
match object.get_data() {
|
||||
CalendarObjectComponent::Event(
|
||||
EventObject {
|
||||
event,
|
||||
timezones: object_timezones,
|
||||
..
|
||||
},
|
||||
overrides,
|
||||
) => {
|
||||
timezones.extend(object_timezones);
|
||||
CalendarObjectComponent::Event(EventObject { event, .. }, overrides) => {
|
||||
ical_calendar_builder = ical_calendar_builder.add_event(event.clone());
|
||||
for _override in overrides {
|
||||
for ev_override in overrides {
|
||||
ical_calendar_builder =
|
||||
ical_calendar_builder.add_event(_override.event.clone());
|
||||
ical_calendar_builder.add_event(ev_override.event.clone());
|
||||
}
|
||||
}
|
||||
CalendarObjectComponent::Todo(todo, overrides) => {
|
||||
ical_calendar_builder = ical_calendar_builder.add_todo(todo.clone());
|
||||
for _override in overrides {
|
||||
ical_calendar_builder = ical_calendar_builder.add_todo(_override.clone());
|
||||
for ev_override in overrides {
|
||||
ical_calendar_builder = ical_calendar_builder.add_todo(ev_override.clone());
|
||||
}
|
||||
}
|
||||
CalendarObjectComponent::Journal(journal, overrides) => {
|
||||
ical_calendar_builder = ical_calendar_builder.add_journal(journal.clone());
|
||||
for _override in overrides {
|
||||
ical_calendar_builder = ical_calendar_builder.add_journal(_override.clone());
|
||||
for ev_override in overrides {
|
||||
ical_calendar_builder = ical_calendar_builder.add_journal(ev_override.clone());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -89,17 +89,12 @@ pub async fn route_mkcalendar<C: CalendarStore, S: SubscriptionStore>(
|
||||
// TODO: Proper error (calendar-timezone precondition)
|
||||
let calendar = IcalParser::new(tz.as_bytes())
|
||||
.next()
|
||||
.ok_or(rustical_dav::Error::BadRequest(
|
||||
"No timezone data provided".to_owned(),
|
||||
))?
|
||||
.ok_or_else(|| rustical_dav::Error::BadRequest("No timezone data provided".to_owned()))?
|
||||
.map_err(|_| rustical_dav::Error::BadRequest("No timezone data provided".to_owned()))?;
|
||||
|
||||
let timezone = calendar
|
||||
.timezones
|
||||
.first()
|
||||
.ok_or(rustical_dav::Error::BadRequest(
|
||||
"No timezone data provided".to_owned(),
|
||||
))?;
|
||||
let timezone = calendar.timezones.first().ok_or_else(|| {
|
||||
rustical_dav::Error::BadRequest("No timezone data provided".to_owned())
|
||||
})?;
|
||||
let timezone: chrono_tz::Tz = timezone
|
||||
.try_into()
|
||||
.map_err(|_| rustical_dav::Error::BadRequest("No timezone data provided".to_owned()))?;
|
||||
@@ -123,14 +118,16 @@ pub async fn route_mkcalendar<C: CalendarStore, S: SubscriptionStore>(
|
||||
synctoken: 0,
|
||||
subscription_url: request.source.map(|href| href.href),
|
||||
push_topic: uuid::Uuid::new_v4().to_string(),
|
||||
components: request
|
||||
.supported_calendar_component_set
|
||||
.map(Into::into)
|
||||
.unwrap_or(vec![
|
||||
CalendarObjectType::Event,
|
||||
CalendarObjectType::Todo,
|
||||
CalendarObjectType::Journal,
|
||||
]),
|
||||
components: request.supported_calendar_component_set.map_or_else(
|
||||
|| {
|
||||
vec![
|
||||
CalendarObjectType::Event,
|
||||
CalendarObjectType::Todo,
|
||||
CalendarObjectType::Journal,
|
||||
]
|
||||
},
|
||||
Into::into,
|
||||
),
|
||||
};
|
||||
|
||||
cal_store.insert_calendar(calendar).await?;
|
||||
|
||||
@@ -53,7 +53,8 @@ pub async fn route_post<C: CalendarStore, S: SubscriptionStore>(
|
||||
push_resource: request
|
||||
.subscription
|
||||
.web_push_subscription
|
||||
.push_resource.clone(),
|
||||
.push_resource
|
||||
.clone(),
|
||||
topic: calendar_resource.cal.push_topic,
|
||||
expiration: expires.naive_local(),
|
||||
public_key: request
|
||||
|
||||
@@ -36,11 +36,9 @@ pub async fn get_objects_calendar_multiget<C: CalendarStore>(
|
||||
}
|
||||
} else {
|
||||
not_found.push(href.to_owned());
|
||||
continue;
|
||||
}
|
||||
} else {
|
||||
not_found.push(href.to_owned());
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@ pub struct TextMatchElement {
|
||||
pub(crate) negate_condition: Option<String>,
|
||||
}
|
||||
|
||||
#[derive(XmlDeserialize, Clone, Debug, PartialEq)]
|
||||
#[derive(XmlDeserialize, Clone, Debug, PartialEq, Eq)]
|
||||
#[allow(dead_code)]
|
||||
// https://www.rfc-editor.org/rfc/rfc4791#section-9.7.2
|
||||
pub struct PropFilterElement {
|
||||
@@ -76,7 +76,7 @@ impl CompFilterElement {
|
||||
let comp_vcal = self.name == "VCALENDAR";
|
||||
match (self.is_not_defined, comp_vcal) {
|
||||
// Client wants VCALENDAR to not exist but we are a VCALENDAR
|
||||
(Some(()), true) => return false,
|
||||
(Some(()), true) |
|
||||
// Client is asking for something different than a vcalendar
|
||||
(None, false) => return false,
|
||||
_ => {}
|
||||
@@ -106,7 +106,7 @@ impl CompFilterElement {
|
||||
let comp_name_matches = self.name == cal_object.get_component_name();
|
||||
match (self.is_not_defined, comp_name_matches) {
|
||||
// Client wants VCALENDAR to not exist but we are a VCALENDAR
|
||||
(Some(()), true) => return false,
|
||||
(Some(()), true) |
|
||||
// Client is asking for something different than a vcalendar
|
||||
(None, false) => return false,
|
||||
_ => {}
|
||||
@@ -164,7 +164,7 @@ impl From<&FilterElement> for CalendarQuery {
|
||||
};
|
||||
}
|
||||
}
|
||||
Default::default()
|
||||
Self::default()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -184,10 +184,6 @@ pub struct CalendarQueryRequest {
|
||||
|
||||
impl From<&CalendarQueryRequest> for CalendarQuery {
|
||||
fn from(value: &CalendarQueryRequest) -> Self {
|
||||
value
|
||||
.filter
|
||||
.as_ref()
|
||||
.map(Self::from)
|
||||
.unwrap_or_default()
|
||||
value.filter.as_ref().map(Self::from).unwrap_or_default()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,7 +33,7 @@ mod tests {
|
||||
PropFilterElement, TextMatchElement,
|
||||
},
|
||||
},
|
||||
calendar_object::{CalendarObjectPropName, CalendarObjectPropWrapperName},
|
||||
calendar_object::{CalendarData, CalendarObjectPropName, CalendarObjectPropWrapperName},
|
||||
};
|
||||
|
||||
#[test]
|
||||
@@ -76,7 +76,7 @@ mod tests {
|
||||
CalendarObjectPropName::Getetag,
|
||||
),
|
||||
CalendarObjectPropWrapperName::CalendarObject(
|
||||
CalendarObjectPropName::CalendarData(Default::default())
|
||||
CalendarObjectPropName::CalendarData(CalendarData::default())
|
||||
),
|
||||
],
|
||||
vec![]
|
||||
@@ -115,6 +115,6 @@ mod tests {
|
||||
timezone: None,
|
||||
timezone_id: None
|
||||
}
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -43,9 +43,9 @@ pub(crate) enum ReportRequest {
|
||||
impl ReportRequest {
|
||||
const fn props(&self) -> &PropfindType<CalendarObjectPropWrapperName> {
|
||||
match &self {
|
||||
Self::CalendarMultiget(CalendarMultigetRequest { prop, .. }) => prop,
|
||||
Self::CalendarQuery(CalendarQueryRequest { prop, .. }) => prop,
|
||||
Self::SyncCollection(SyncCollectionRequest { prop, .. }) => prop,
|
||||
Self::CalendarMultiget(CalendarMultigetRequest { prop, .. })
|
||||
| Self::CalendarQuery(CalendarQueryRequest { prop, .. })
|
||||
| Self::SyncCollection(SyncCollectionRequest { prop, .. }) => prop,
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -184,7 +184,7 @@ mod tests {
|
||||
"/caldav/user/user/6f787542-5256-401a-8db97003260da/ae7a998fdfd1d84a20391168962c62b".to_owned()
|
||||
]
|
||||
})
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -241,7 +241,7 @@ mod tests {
|
||||
timezone: None,
|
||||
timezone_id: None,
|
||||
})
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -269,6 +269,6 @@ mod tests {
|
||||
"/caldav/user/user/6f787542-5256-401a-8db97003260da/ae7a998fdfd1d84a20391168962c62b".to_owned()
|
||||
]
|
||||
})
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,7 +18,7 @@ use rustical_xml::{EnumVariants, PropName};
|
||||
use rustical_xml::{XmlDeserialize, XmlSerialize};
|
||||
use serde::Deserialize;
|
||||
|
||||
#[derive(XmlDeserialize, XmlSerialize, PartialEq, Clone, EnumVariants, PropName)]
|
||||
#[derive(XmlDeserialize, XmlSerialize, PartialEq, Eq, Clone, EnumVariants, PropName)]
|
||||
#[xml(unit_variants_ident = "CalendarPropName")]
|
||||
pub enum CalendarProp {
|
||||
// CalDAV (RFC 4791)
|
||||
@@ -54,7 +54,7 @@ pub enum CalendarProp {
|
||||
MaxDateTime(String),
|
||||
}
|
||||
|
||||
#[derive(XmlDeserialize, XmlSerialize, PartialEq, Clone, EnumVariants, PropName)]
|
||||
#[derive(XmlDeserialize, XmlSerialize, PartialEq, Eq, Clone, EnumVariants, PropName)]
|
||||
#[xml(unit_variants_ident = "CalendarPropWrapperName", untagged)]
|
||||
pub enum CalendarPropWrapper {
|
||||
Calendar(CalendarProp),
|
||||
@@ -135,7 +135,9 @@ impl Resource for CalendarResource {
|
||||
}
|
||||
CalendarPropName::CalendarTimezone => {
|
||||
CalendarProp::CalendarTimezone(self.cal.timezone_id.as_ref().and_then(|tzid| {
|
||||
vtimezones_rs::VTIMEZONES.get(tzid).map(|tz| (*tz).to_string())
|
||||
vtimezones_rs::VTIMEZONES
|
||||
.get(tzid)
|
||||
.map(|tz| (*tz).to_string())
|
||||
}))
|
||||
}
|
||||
// chrono_tz uses the IANA database
|
||||
@@ -154,13 +156,13 @@ impl Resource for CalendarResource {
|
||||
CalendarPropName::SupportedCalendarData => {
|
||||
CalendarProp::SupportedCalendarData(SupportedCalendarData::default())
|
||||
}
|
||||
CalendarPropName::MaxResourceSize => CalendarProp::MaxResourceSize(10000000),
|
||||
CalendarPropName::MaxResourceSize => CalendarProp::MaxResourceSize(10_000_000),
|
||||
CalendarPropName::SupportedReportSet => {
|
||||
CalendarProp::SupportedReportSet(SupportedReportSet::all())
|
||||
}
|
||||
CalendarPropName::Source => CalendarProp::Source(
|
||||
self.cal.subscription_url.clone().map(HrefElement::from),
|
||||
),
|
||||
CalendarPropName::Source => {
|
||||
CalendarProp::Source(self.cal.subscription_url.clone().map(HrefElement::from))
|
||||
}
|
||||
CalendarPropName::MinDateTime => {
|
||||
CalendarProp::MinDateTime(CalDateTime::from(DateTime::<Utc>::MIN_UTC).format())
|
||||
}
|
||||
@@ -199,22 +201,20 @@ impl Resource for CalendarResource {
|
||||
// TODO: Proper error (calendar-timezone precondition)
|
||||
let calendar = IcalParser::new(tz.as_bytes())
|
||||
.next()
|
||||
.ok_or(rustical_dav::Error::BadRequest(
|
||||
"No timezone data provided".to_owned(),
|
||||
))?
|
||||
.ok_or_else(|| {
|
||||
rustical_dav::Error::BadRequest(
|
||||
"No timezone data provided".to_owned(),
|
||||
)
|
||||
})?
|
||||
.map_err(|_| {
|
||||
rustical_dav::Error::BadRequest(
|
||||
"No timezone data provided".to_owned(),
|
||||
)
|
||||
})?;
|
||||
|
||||
let timezone =
|
||||
calendar
|
||||
.timezones
|
||||
.first()
|
||||
.ok_or(rustical_dav::Error::BadRequest(
|
||||
"No timezone data provided".to_owned(),
|
||||
))?;
|
||||
let timezone = calendar.timezones.first().ok_or_else(|| {
|
||||
rustical_dav::Error::BadRequest("No timezone data provided".to_owned())
|
||||
})?;
|
||||
let timezone: chrono_tz::Tz = timezone.try_into().map_err(|_| {
|
||||
rustical_dav::Error::BadRequest("No timezone data provided".to_owned())
|
||||
})?;
|
||||
@@ -223,7 +223,6 @@ impl Resource for CalendarResource {
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
CalendarProp::TimezoneServiceSet(_) => Err(rustical_dav::Error::PropReadOnly),
|
||||
CalendarProp::CalendarTimezoneId(timezone_id) => {
|
||||
if let Some(tzid) = &timezone_id
|
||||
&& !vtimezones_rs::VTIMEZONES.contains_key(tzid)
|
||||
@@ -243,13 +242,13 @@ impl Resource for CalendarResource {
|
||||
self.cal.components = comp_set.into();
|
||||
Ok(())
|
||||
}
|
||||
CalendarProp::SupportedCalendarData(_) => Err(rustical_dav::Error::PropReadOnly),
|
||||
CalendarProp::MaxResourceSize(_) => Err(rustical_dav::Error::PropReadOnly),
|
||||
CalendarProp::SupportedReportSet(_) => Err(rustical_dav::Error::PropReadOnly),
|
||||
// Converting between a calendar subscription calendar and a normal one would be weird
|
||||
CalendarProp::Source(_) => Err(rustical_dav::Error::PropReadOnly),
|
||||
CalendarProp::MinDateTime(_) => Err(rustical_dav::Error::PropReadOnly),
|
||||
CalendarProp::MaxDateTime(_) => Err(rustical_dav::Error::PropReadOnly),
|
||||
CalendarProp::TimezoneServiceSet(_)
|
||||
| CalendarProp::SupportedCalendarData(_)
|
||||
| CalendarProp::MaxResourceSize(_)
|
||||
| CalendarProp::SupportedReportSet(_)
|
||||
| CalendarProp::Source(_)
|
||||
| CalendarProp::MinDateTime(_)
|
||||
| CalendarProp::MaxDateTime(_) => Err(rustical_dav::Error::PropReadOnly),
|
||||
},
|
||||
CalendarPropWrapper::SyncToken(prop) => SyncTokenExtension::set_prop(self, prop),
|
||||
CalendarPropWrapper::DavPush(prop) => DavPushExtension::set_prop(self, prop),
|
||||
@@ -275,7 +274,6 @@ impl Resource for CalendarResource {
|
||||
self.cal.timezone_id = None;
|
||||
Ok(())
|
||||
}
|
||||
CalendarPropName::TimezoneServiceSet => Err(rustical_dav::Error::PropReadOnly),
|
||||
CalendarPropName::CalendarOrder => {
|
||||
self.cal.meta.order = 0;
|
||||
Ok(())
|
||||
@@ -283,13 +281,13 @@ impl Resource for CalendarResource {
|
||||
CalendarPropName::SupportedCalendarComponentSet => {
|
||||
Err(rustical_dav::Error::PropReadOnly)
|
||||
}
|
||||
CalendarPropName::SupportedCalendarData => Err(rustical_dav::Error::PropReadOnly),
|
||||
CalendarPropName::MaxResourceSize => Err(rustical_dav::Error::PropReadOnly),
|
||||
CalendarPropName::SupportedReportSet => Err(rustical_dav::Error::PropReadOnly),
|
||||
// Converting a calendar subscription calendar into a normal one would be weird
|
||||
CalendarPropName::Source => Err(rustical_dav::Error::PropReadOnly),
|
||||
CalendarPropName::MinDateTime => Err(rustical_dav::Error::PropReadOnly),
|
||||
CalendarPropName::MaxDateTime => Err(rustical_dav::Error::PropReadOnly),
|
||||
CalendarPropName::TimezoneServiceSet
|
||||
| CalendarPropName::SupportedCalendarData
|
||||
| CalendarPropName::MaxResourceSize
|
||||
| CalendarPropName::SupportedReportSet
|
||||
| CalendarPropName::Source
|
||||
| CalendarPropName::MinDateTime
|
||||
| CalendarPropName::MaxDateTime => Err(rustical_dav::Error::PropReadOnly),
|
||||
},
|
||||
CalendarPropWrapperName::SyncToken(prop) => SyncTokenExtension::remove_prop(self, prop),
|
||||
CalendarPropWrapperName::DavPush(prop) => DavPushExtension::remove_prop(self, prop),
|
||||
|
||||
@@ -78,7 +78,7 @@ pub async fn put_event<C: CalendarStore>(
|
||||
true
|
||||
};
|
||||
|
||||
let object = if let Ok(obj) = CalendarObject::from_ics(body.clone()) { obj } else {
|
||||
let Ok(object) = CalendarObject::from_ics(body.clone()) else {
|
||||
debug!("invalid calendar data:\n{body}");
|
||||
return Err(Error::PreconditionFailed(Precondition::ValidCalendarData));
|
||||
};
|
||||
|
||||
@@ -17,7 +17,7 @@ pub enum CalendarObjectProp {
|
||||
CalendarData(String),
|
||||
}
|
||||
|
||||
#[derive(XmlDeserialize, XmlSerialize, PartialEq, Clone, EnumVariants, PropName)]
|
||||
#[derive(XmlDeserialize, XmlSerialize, PartialEq, Eq, Clone, EnumVariants, PropName)]
|
||||
#[xml(unit_variants_ident = "CalendarObjectPropWrapperName", untagged)]
|
||||
pub enum CalendarObjectPropWrapper {
|
||||
CalendarObject(CalendarObjectProp),
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
use super::prop::{CalendarObjectPropWrapper, CalendarObjectPropWrapperName, CalendarObjectPropName, CalendarObjectProp, CalendarData};
|
||||
use super::prop::{
|
||||
CalendarData, CalendarObjectProp, CalendarObjectPropName, CalendarObjectPropWrapper,
|
||||
CalendarObjectPropWrapperName,
|
||||
};
|
||||
use crate::Error;
|
||||
use derive_more::derive::{From, Into};
|
||||
use rustical_dav::{
|
||||
|
||||
@@ -106,9 +106,8 @@ where
|
||||
D: Deserializer<'de>,
|
||||
{
|
||||
let name: String = Deserialize::deserialize(deserializer)?;
|
||||
if let Some(object_id) = name.strip_suffix(".ics") {
|
||||
Ok(object_id.to_owned())
|
||||
} else {
|
||||
Err(serde::de::Error::custom("Missing .ics extension"))
|
||||
}
|
||||
name.strip_suffix(".ics").map_or_else(
|
||||
|| Err(serde::de::Error::custom("Missing .ics extension")),
|
||||
|object_id| Ok(object_id.to_owned()),
|
||||
)
|
||||
}
|
||||
|
||||
@@ -62,7 +62,8 @@ pub enum Error {
|
||||
}
|
||||
|
||||
impl Error {
|
||||
#[must_use] pub fn status_code(&self) -> StatusCode {
|
||||
#[must_use]
|
||||
pub fn status_code(&self) -> StatusCode {
|
||||
match self {
|
||||
Self::StoreError(err) => match err {
|
||||
rustical_store::Error::NotFound => StatusCode::NOT_FOUND,
|
||||
@@ -70,12 +71,11 @@ impl Error {
|
||||
rustical_store::Error::ReadOnly => StatusCode::FORBIDDEN,
|
||||
_ => StatusCode::INTERNAL_SERVER_ERROR,
|
||||
},
|
||||
Self::ChronoParseError(_) => StatusCode::INTERNAL_SERVER_ERROR,
|
||||
Self::DavError(err) => StatusCode::try_from(err.status_code().as_u16())
|
||||
.expect("Just converting between versions"),
|
||||
Self::Unauthorized => StatusCode::UNAUTHORIZED,
|
||||
Self::XmlDecodeError(_) => StatusCode::BAD_REQUEST,
|
||||
Self::NotImplemented => StatusCode::INTERNAL_SERVER_ERROR,
|
||||
Self::ChronoParseError(_) | Self::NotImplemented => StatusCode::INTERNAL_SERVER_ERROR,
|
||||
Self::NotFound => StatusCode::NOT_FOUND,
|
||||
Self::IcalError(err) => err.status_code(),
|
||||
Self::PreconditionFailed(_err) => StatusCode::PRECONDITION_FAILED,
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
#![warn(clippy::all, clippy::pedantic, clippy::nursery)]
|
||||
#![allow(clippy::missing_errors_doc, clippy::missing_panics_doc)]
|
||||
use axum::{Extension, Router};
|
||||
use derive_more::Constructor;
|
||||
use principal::PrincipalResourceService;
|
||||
|
||||
@@ -37,7 +37,7 @@ pub enum PrincipalProp {
|
||||
#[derive(XmlDeserialize, XmlSerialize, PartialEq, Eq, Clone)]
|
||||
pub struct CalendarHomeSet(#[xml(ty = "untagged", flatten)] pub Vec<HrefElement>);
|
||||
|
||||
#[derive(XmlDeserialize, XmlSerialize, PartialEq, Clone, EnumVariants, PropName)]
|
||||
#[derive(XmlDeserialize, XmlSerialize, PartialEq, Eq, Clone, EnumVariants, PropName)]
|
||||
#[xml(unit_variants_ident = "PrincipalPropWrapperName", untagged)]
|
||||
pub enum PrincipalPropWrapper {
|
||||
Principal(PrincipalProp),
|
||||
|
||||
Reference in New Issue
Block a user