mirror of
https://github.com/lennart-k/rustical.git
synced 2025-12-14 01:12:24 +00:00
Lots of clippy appeasement
This commit is contained in:
@@ -35,9 +35,9 @@ pub enum Error {
|
||||
}
|
||||
|
||||
impl Error {
|
||||
#[must_use] pub const fn status_code(&self) -> StatusCode {
|
||||
#[must_use]
|
||||
pub const fn status_code(&self) -> StatusCode {
|
||||
match self {
|
||||
Self::InternalError => StatusCode::INTERNAL_SERVER_ERROR,
|
||||
Self::NotFound => StatusCode::NOT_FOUND,
|
||||
Self::BadRequest(_) => StatusCode::BAD_REQUEST,
|
||||
Self::Unauthorized => StatusCode::UNAUTHORIZED,
|
||||
@@ -52,7 +52,7 @@ impl Error {
|
||||
},
|
||||
Self::PropReadOnly => StatusCode::CONFLICT,
|
||||
Self::PreconditionFailed => StatusCode::PRECONDITION_FAILED,
|
||||
Self::IOError(_) => StatusCode::INTERNAL_SERVER_ERROR,
|
||||
Self::InternalError | Self::IOError(_) => StatusCode::INTERNAL_SERVER_ERROR,
|
||||
Self::Forbidden => StatusCode::FORBIDDEN,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@ use crate::{
|
||||
};
|
||||
use rustical_xml::{EnumVariants, PropName, XmlDeserialize, XmlSerialize};
|
||||
|
||||
#[derive(XmlDeserialize, XmlSerialize, PartialEq, Clone, PropName, EnumVariants)]
|
||||
#[derive(XmlDeserialize, XmlSerialize, PartialEq, Eq, Clone, PropName, EnumVariants)]
|
||||
#[xml(unit_variants_ident = "CommonPropertiesPropName")]
|
||||
pub enum CommonPropertiesProp {
|
||||
// WebDAV (RFC 2518)
|
||||
@@ -39,9 +39,9 @@ pub trait CommonPropertiesExtension: Resource {
|
||||
CommonPropertiesPropName::Resourcetype => {
|
||||
CommonPropertiesProp::Resourcetype(self.get_resourcetype())
|
||||
}
|
||||
CommonPropertiesPropName::Displayname => {
|
||||
CommonPropertiesProp::Displayname(self.get_displayname().map(std::string::ToString::to_string))
|
||||
}
|
||||
CommonPropertiesPropName::Displayname => CommonPropertiesProp::Displayname(
|
||||
self.get_displayname().map(std::string::ToString::to_string),
|
||||
),
|
||||
CommonPropertiesPropName::CurrentUserPrincipal => {
|
||||
CommonPropertiesProp::CurrentUserPrincipal(
|
||||
principal_uri.principal_uri(principal.get_id()).into(),
|
||||
|
||||
@@ -85,10 +85,11 @@ impl<S: Send + Sync> FromRequestParts<S> for Depth {
|
||||
parts: &mut axum::http::request::Parts,
|
||||
_state: &S,
|
||||
) -> Result<Self, Self::Rejection> {
|
||||
if let Some(depth_header) = parts.headers.get("Depth") {
|
||||
depth_header.as_bytes().try_into()
|
||||
} else {
|
||||
Ok(Self::Zero)
|
||||
}
|
||||
parts
|
||||
.headers
|
||||
.get("Depth")
|
||||
.map_or(Ok(Self::Zero), |depth_header| {
|
||||
depth_header.as_bytes().try_into()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,11 +30,10 @@ impl<S: Send + Sync> FromRequestParts<S> for Overwrite {
|
||||
parts: &mut axum::http::request::Parts,
|
||||
_state: &S,
|
||||
) -> Result<Self, Self::Rejection> {
|
||||
if let Some(overwrite_header) = parts.headers.get("Overwrite") {
|
||||
overwrite_header.as_bytes().try_into()
|
||||
} else {
|
||||
Ok(Self::default())
|
||||
}
|
||||
parts.headers.get("Overwrite").map_or_else(
|
||||
|| Ok(Self::default()),
|
||||
|overwrite_header| overwrite_header.as_bytes().try_into(),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -60,7 +59,7 @@ mod tests {
|
||||
#[tokio::test]
|
||||
async fn test_overwrite_default() {
|
||||
let request = Request::put("asd").body(()).unwrap();
|
||||
let (mut parts, _) = request.into_parts();
|
||||
let (mut parts, ()) = request.into_parts();
|
||||
let overwrite = Overwrite::from_request_parts(&mut parts, &())
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
#![warn(clippy::all, clippy::pedantic, clippy::nursery)]
|
||||
#![allow(clippy::missing_errors_doc)]
|
||||
pub mod error;
|
||||
pub mod extensions;
|
||||
pub mod header;
|
||||
|
||||
@@ -47,7 +47,8 @@ pub struct UserPrivilegeSet {
|
||||
}
|
||||
|
||||
impl UserPrivilegeSet {
|
||||
#[must_use] pub fn has(&self, privilege: &UserPrivilege) -> bool {
|
||||
#[must_use]
|
||||
pub fn has(&self, privilege: &UserPrivilege) -> bool {
|
||||
if (privilege == &UserPrivilege::WriteProperties
|
||||
|| privilege == &UserPrivilege::WriteContent)
|
||||
&& self.privileges.contains(&UserPrivilege::Write)
|
||||
@@ -57,13 +58,15 @@ impl UserPrivilegeSet {
|
||||
self.privileges.contains(privilege) || self.privileges.contains(&UserPrivilege::All)
|
||||
}
|
||||
|
||||
#[must_use] pub fn all() -> Self {
|
||||
#[must_use]
|
||||
pub fn all() -> Self {
|
||||
Self {
|
||||
privileges: HashSet::from([UserPrivilege::All]),
|
||||
}
|
||||
}
|
||||
|
||||
#[must_use] pub fn owner_only(is_owner: bool) -> Self {
|
||||
#[must_use]
|
||||
pub fn owner_only(is_owner: bool) -> Self {
|
||||
if is_owner {
|
||||
Self::all()
|
||||
} else {
|
||||
@@ -71,7 +74,8 @@ impl UserPrivilegeSet {
|
||||
}
|
||||
}
|
||||
|
||||
#[must_use] pub fn owner_read(is_owner: bool) -> Self {
|
||||
#[must_use]
|
||||
pub fn owner_read(is_owner: bool) -> Self {
|
||||
if is_owner {
|
||||
Self::read_only()
|
||||
} else {
|
||||
@@ -79,7 +83,8 @@ impl UserPrivilegeSet {
|
||||
}
|
||||
}
|
||||
|
||||
#[must_use] pub fn owner_write_properties(is_owner: bool) -> Self {
|
||||
#[must_use]
|
||||
pub fn owner_write_properties(is_owner: bool) -> Self {
|
||||
// Content is read-only but we can write properties
|
||||
if is_owner {
|
||||
Self::write_properties()
|
||||
@@ -88,7 +93,8 @@ impl UserPrivilegeSet {
|
||||
}
|
||||
}
|
||||
|
||||
#[must_use] pub fn read_only() -> Self {
|
||||
#[must_use]
|
||||
pub fn read_only() -> Self {
|
||||
Self {
|
||||
privileges: HashSet::from([
|
||||
UserPrivilege::Read,
|
||||
@@ -98,7 +104,8 @@ impl UserPrivilegeSet {
|
||||
}
|
||||
}
|
||||
|
||||
#[must_use] pub fn write_properties() -> Self {
|
||||
#[must_use]
|
||||
pub fn write_properties() -> Self {
|
||||
Self {
|
||||
privileges: HashSet::from([
|
||||
UserPrivilege::Read,
|
||||
|
||||
@@ -9,42 +9,50 @@ pub type MethodFunction<State> =
|
||||
|
||||
pub trait AxumMethods: Sized + Send + Sync + 'static {
|
||||
#[inline]
|
||||
#[must_use] fn report() -> Option<MethodFunction<Self>> {
|
||||
#[must_use]
|
||||
fn report() -> Option<MethodFunction<Self>> {
|
||||
None
|
||||
}
|
||||
|
||||
#[inline]
|
||||
#[must_use] fn get() -> Option<MethodFunction<Self>> {
|
||||
#[must_use]
|
||||
fn get() -> Option<MethodFunction<Self>> {
|
||||
None
|
||||
}
|
||||
|
||||
#[inline]
|
||||
#[must_use] fn post() -> Option<MethodFunction<Self>> {
|
||||
#[must_use]
|
||||
fn post() -> Option<MethodFunction<Self>> {
|
||||
None
|
||||
}
|
||||
|
||||
#[inline]
|
||||
#[must_use] fn mkcol() -> Option<MethodFunction<Self>> {
|
||||
#[must_use]
|
||||
fn mkcol() -> Option<MethodFunction<Self>> {
|
||||
None
|
||||
}
|
||||
|
||||
#[inline]
|
||||
#[must_use] fn mkcalendar() -> Option<MethodFunction<Self>> {
|
||||
#[must_use]
|
||||
fn mkcalendar() -> Option<MethodFunction<Self>> {
|
||||
None
|
||||
}
|
||||
|
||||
#[inline]
|
||||
#[must_use] fn put() -> Option<MethodFunction<Self>> {
|
||||
#[must_use]
|
||||
fn put() -> Option<MethodFunction<Self>> {
|
||||
None
|
||||
}
|
||||
|
||||
#[inline]
|
||||
#[must_use] fn import() -> Option<MethodFunction<Self>> {
|
||||
#[must_use]
|
||||
fn import() -> Option<MethodFunction<Self>> {
|
||||
None
|
||||
}
|
||||
|
||||
#[inline]
|
||||
#[must_use] fn allow_header() -> Allow {
|
||||
#[must_use]
|
||||
fn allow_header() -> Allow {
|
||||
let mut allow = vec![
|
||||
Method::from_str("PROPFIND").unwrap(),
|
||||
Method::from_str("PROPPATCH").unwrap(),
|
||||
|
||||
@@ -42,7 +42,8 @@ pub trait Resource: Clone + Send + 'static {
|
||||
|
||||
fn get_resourcetype(&self) -> Resourcetype;
|
||||
|
||||
#[must_use] fn list_props() -> Vec<(Option<Namespace<'static>>, &'static str)> {
|
||||
#[must_use]
|
||||
fn list_props() -> Vec<(Option<Namespace<'static>>, &'static str)> {
|
||||
Self::Prop::variant_names()
|
||||
}
|
||||
|
||||
@@ -75,27 +76,27 @@ pub trait Resource: Clone + Send + 'static {
|
||||
}
|
||||
|
||||
fn satisfies_if_match(&self, if_match: &IfMatch) -> bool {
|
||||
if let Some(etag) = self.get_etag() {
|
||||
if let Ok(etag) = ETag::from_str(&etag) {
|
||||
if_match.precondition_passes(&etag)
|
||||
} else {
|
||||
if_match.is_any()
|
||||
}
|
||||
} else {
|
||||
if_match.is_any()
|
||||
}
|
||||
self.get_etag().map_or_else(
|
||||
|| if_match.is_any(),
|
||||
|etag| {
|
||||
ETag::from_str(&etag).map_or_else(
|
||||
|_| if_match.is_any(),
|
||||
|etag| if_match.precondition_passes(&etag),
|
||||
)
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
fn satisfies_if_none_match(&self, if_none_match: &IfNoneMatch) -> bool {
|
||||
if let Some(etag) = self.get_etag() {
|
||||
if let Ok(etag) = ETag::from_str(&etag) {
|
||||
if_none_match.precondition_passes(&etag)
|
||||
} else {
|
||||
if_none_match != &IfNoneMatch::any()
|
||||
}
|
||||
} else {
|
||||
if_none_match != &IfNoneMatch::any()
|
||||
}
|
||||
self.get_etag().map_or_else(
|
||||
|| if_none_match != &IfNoneMatch::any(),
|
||||
|etag| {
|
||||
ETag::from_str(&etag).map_or_else(
|
||||
|_| if_none_match != &IfNoneMatch::any(),
|
||||
|etag| if_none_match.precondition_passes(&etag),
|
||||
)
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
fn get_user_privileges(
|
||||
|
||||
@@ -76,10 +76,7 @@ pub trait ResourceService: Clone + Sized + Send + Sync + AxumMethods + 'static {
|
||||
Err(crate::Error::Forbidden.into())
|
||||
}
|
||||
|
||||
fn axum_service(self) -> AxumService<Self>
|
||||
where
|
||||
Self: AxumMethods,
|
||||
{
|
||||
fn axum_service(self) -> AxumService<Self> {
|
||||
AxumService::new(self)
|
||||
}
|
||||
|
||||
|
||||
@@ -8,7 +8,8 @@ pub struct HrefElement {
|
||||
}
|
||||
|
||||
impl HrefElement {
|
||||
#[must_use] pub const fn new(href: String) -> Self {
|
||||
#[must_use]
|
||||
pub const fn new(href: String) -> Self {
|
||||
Self { href }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@ pub struct PropstatElement<PropType: XmlSerialize> {
|
||||
pub status: StatusCode,
|
||||
}
|
||||
|
||||
#[allow(clippy::trivially_copy_pass_by_ref)]
|
||||
fn xml_serialize_status(
|
||||
status: &StatusCode,
|
||||
ns: Option<Namespace>,
|
||||
@@ -56,6 +57,7 @@ pub struct ResponseElement<PropstatType: XmlSerialize> {
|
||||
pub propstat: Vec<PropstatWrapper<PropstatType>>,
|
||||
}
|
||||
|
||||
#[allow(clippy::trivially_copy_pass_by_ref, clippy::ref_option)]
|
||||
fn xml_serialize_optional_status(
|
||||
val: &Option<StatusCode>,
|
||||
ns: Option<Namespace>,
|
||||
|
||||
@@ -6,7 +6,7 @@ use rustical_xml::XmlDeserialize;
|
||||
use rustical_xml::XmlError;
|
||||
use rustical_xml::XmlRootTag;
|
||||
|
||||
#[derive(Debug, Clone, XmlDeserialize, XmlRootTag, PartialEq)]
|
||||
#[derive(Debug, Clone, XmlDeserialize, XmlRootTag, PartialEq, Eq)]
|
||||
#[xml(root = "propfind", ns = "crate::namespace::NS_DAV")]
|
||||
pub struct PropfindElement<PN: XmlDeserialize> {
|
||||
#[xml(ty = "untagged")]
|
||||
|
||||
@@ -10,7 +10,8 @@ pub struct SupportedReportSet<T: XmlSerialize + 'static> {
|
||||
}
|
||||
|
||||
impl<T: XmlSerialize + Clone + 'static> SupportedReportSet<T> {
|
||||
#[must_use] pub fn new(methods: Vec<T>) -> Self {
|
||||
#[must_use]
|
||||
pub fn new(methods: Vec<T>) -> Self {
|
||||
Self {
|
||||
supported_report: methods
|
||||
.into_iter()
|
||||
|
||||
@@ -40,6 +40,6 @@ mod tests {
|
||||
<calendar-color xmlns="http://calendarserver.org/ns/"/>
|
||||
</resourcetype>
|
||||
</document>"#
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -56,7 +56,7 @@ impl From<LimitElement> for u64 {
|
||||
#[derive(XmlDeserialize, Clone, Debug, PartialEq, Eq)]
|
||||
pub struct NresultsElement(#[xml(ty = "text")] u64);
|
||||
|
||||
#[derive(XmlDeserialize, Clone, Debug, PartialEq, XmlRootTag)]
|
||||
#[derive(XmlDeserialize, Clone, Debug, PartialEq, Eq, XmlRootTag)]
|
||||
// <!ELEMENT sync-collection (sync-token, sync-level, limit?, prop)>
|
||||
// <!-- DAV:limit defined in RFC 5323, Section 5.17 -->
|
||||
// <!-- DAV:prop defined in RFC 4918, Section 14.18 -->
|
||||
@@ -106,11 +106,11 @@ mod tests {
|
||||
assert_eq!(
|
||||
request,
|
||||
SyncCollectionRequest {
|
||||
sync_token: "".to_owned(),
|
||||
sync_token: String::new(),
|
||||
sync_level: SyncLevel::One,
|
||||
prop: PropfindType::Prop(PropElement(vec![TestPropName::Getetag], vec![])),
|
||||
limit: Some(100.into())
|
||||
}
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,15 +17,13 @@ impl XmlSerialize for TagList {
|
||||
namespaces: &HashMap<Namespace, &str>,
|
||||
writer: &mut quick_xml::Writer<&mut Vec<u8>>,
|
||||
) -> std::io::Result<()> {
|
||||
let prefix = ns
|
||||
.and_then(|ns| namespaces.get(&ns))
|
||||
.map(|prefix| {
|
||||
if prefix.is_empty() {
|
||||
String::new()
|
||||
} else {
|
||||
format!("{prefix}:")
|
||||
}
|
||||
});
|
||||
let prefix = ns.and_then(|ns| namespaces.get(&ns)).map(|prefix| {
|
||||
if prefix.is_empty() {
|
||||
String::new()
|
||||
} else {
|
||||
format!("{prefix}:")
|
||||
}
|
||||
});
|
||||
let has_prefix = prefix.is_some();
|
||||
let tagname = tag.map(|tag| [&prefix.unwrap_or_default(), tag].concat());
|
||||
|
||||
|
||||
Reference in New Issue
Block a user