Lots of clippy appeasement

This commit is contained in:
Lennart
2025-10-27 20:12:21 +01:00
parent 0d071d3b92
commit 86cf490fa9
84 changed files with 413 additions and 435 deletions

View File

@@ -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,
}
}

View File

@@ -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(),

View File

@@ -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()
})
}
}

View File

@@ -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();

View File

@@ -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;

View File

@@ -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,

View File

@@ -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(),

View File

@@ -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(

View File

@@ -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)
}

View File

@@ -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 }
}
}

View File

@@ -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>,

View File

@@ -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")]

View File

@@ -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()

View File

@@ -40,6 +40,6 @@ mod tests {
<calendar-color xmlns="http://calendarserver.org/ns/"/>
</resourcetype>
</document>"#
)
);
}
}

View File

@@ -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())
}
)
);
}
}

View File

@@ -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());