From cee3389eb716b4d48943a04b23811d9470d9d668 Mon Sep 17 00:00:00 2001 From: Ericson Soares Date: Thu, 20 Jun 2024 18:54:14 -0300 Subject: [PATCH] Stronger lint on sync subcrate --- crates/images/src/consts.rs | 2 +- crates/images/src/lib.rs | 15 +++++++++++---- crates/sync/src/compressed.rs | 36 ++++++++++++++++++++--------------- crates/sync/src/crdt.rs | 20 ++++++++++--------- crates/sync/src/lib.rs | 29 ++++++++++++++++++++++++++++ 5 files changed, 73 insertions(+), 29 deletions(-) diff --git a/crates/images/src/consts.rs b/crates/images/src/consts.rs index 022e41d6e..d68675b69 100644 --- a/crates/images/src/consts.rs +++ b/crates/images/src/consts.rs @@ -30,7 +30,7 @@ pub const HEIF_EXTENSIONS: [&str; 8] = [ /// This is the target pixel count for all SVG images to be rendered at. /// /// It is 512x512, but if the SVG has a non-1:1 aspect ratio we need to account for that. -pub const SVG_TARGET_PX: f32 = 262_144_f32; +pub const SVG_TARGET_PX: f32 = 262_144f32; /// The size that PDF pages are rendered at. /// diff --git a/crates/images/src/lib.rs b/crates/images/src/lib.rs index f83810b01..64f5c1eb1 100644 --- a/crates/images/src/lib.rs +++ b/crates/images/src/lib.rs @@ -10,14 +10,21 @@ clippy::unwrap_used, unused_qualifications, rust_2018_idioms, - clippy::expect_used, trivial_casts, trivial_numeric_casts, unused_allocation, - clippy::as_conversions, - clippy::dbg_macro + clippy::unnecessary_cast, + clippy::cast_lossless, + clippy::cast_possible_truncation, + clippy::cast_possible_wrap, + clippy::cast_precision_loss, + clippy::cast_sign_loss, + clippy::dbg_macro, + clippy::deprecated_cfg_attr, + clippy::separated_literal_suffix, + deprecated )] -#![forbid(unsafe_code)] +#![forbid(deprecated_in_future)] #![allow(clippy::missing_errors_doc, clippy::module_name_repetitions)] use std::{fs, path::Path}; diff --git a/crates/sync/src/compressed.rs b/crates/sync/src/compressed.rs index 1056a68ad..0db151330 100644 --- a/crates/sync/src/compressed.rs +++ b/crates/sync/src/compressed.rs @@ -1,3 +1,5 @@ +use std::mem; + use serde::{Deserialize, Serialize}; use uhlc::NTP64; use uuid::Uuid; @@ -6,11 +8,12 @@ use crate::{CRDTOperation, CRDTOperationData}; pub type CompressedCRDTOperationsForModel = Vec<(rmpv::Value, Vec)>; -/// Stores a bunch of CRDTOperations in a more memory-efficient form for sending to the cloud. +/// Stores a bunch of [`CRDTOperation`]s in a more memory-efficient form for sending to the cloud. #[derive(Serialize, Deserialize, Debug, PartialEq)] pub struct CompressedCRDTOperations(pub Vec<(Uuid, Vec<(u16, CompressedCRDTOperationsForModel)>)>); impl CompressedCRDTOperations { + #[must_use] pub fn new(ops: Vec) -> Self { let mut compressed = vec![]; @@ -32,34 +35,34 @@ impl CompressedCRDTOperations { for op in ops_iter { if instance_id != op.instance { model.push(( - std::mem::replace(&mut record_id, op.record_id.clone()), - std::mem::take(&mut record), + mem::replace(&mut record_id, op.record_id.clone()), + mem::take(&mut record), )); instance.push(( - std::mem::replace(&mut model_str, op.model), - std::mem::take(&mut model), + mem::replace(&mut model_str, op.model), + mem::take(&mut model), )); compressed.push(( - std::mem::replace(&mut instance_id, op.instance), - std::mem::take(&mut instance), + mem::replace(&mut instance_id, op.instance), + mem::take(&mut instance), )); } else if model_str != op.model { model.push(( - std::mem::replace(&mut record_id, op.record_id.clone()), - std::mem::take(&mut record), + mem::replace(&mut record_id, op.record_id.clone()), + mem::take(&mut record), )); instance.push(( - std::mem::replace(&mut model_str, op.model), - std::mem::take(&mut model), + mem::replace(&mut model_str, op.model), + mem::take(&mut model), )); } else if record_id != op.record_id { model.push(( - std::mem::replace(&mut record_id, op.record_id.clone()), - std::mem::take(&mut record), + mem::replace(&mut record_id, op.record_id.clone()), + mem::take(&mut record), )); } - record.push(CompressedCRDTOperation::from(op)) + record.push(CompressedCRDTOperation::from(op)); } model.push((record_id, record)); @@ -69,6 +72,7 @@ impl CompressedCRDTOperations { Self(compressed) } + #[must_use] pub fn first(&self) -> Option<(Uuid, u16, &rmpv::Value, &CompressedCRDTOperation)> { self.0.first().and_then(|(instance, data)| { data.first().and_then(|(model, data)| { @@ -78,6 +82,7 @@ impl CompressedCRDTOperations { }) } + #[must_use] pub fn last(&self) -> Option<(Uuid, u16, &rmpv::Value, &CompressedCRDTOperation)> { self.0.last().and_then(|(instance, data)| { data.last().and_then(|(model, data)| { @@ -104,6 +109,7 @@ impl CompressedCRDTOperations { self.len() == 0 } + #[must_use] pub fn into_ops(self) -> Vec { let mut ops = vec![]; @@ -117,7 +123,7 @@ impl CompressedCRDTOperations { record_id: record_id.clone(), timestamp: op.timestamp, data: op.data, - }) + }); } } } diff --git a/crates/sync/src/crdt.rs b/crates/sync/src/crdt.rs index 1b5f265c2..2a3872c92 100644 --- a/crates/sync/src/crdt.rs +++ b/crates/sync/src/crdt.rs @@ -1,4 +1,4 @@ -use std::{collections::BTreeMap, fmt::Debug}; +use std::{collections::BTreeMap, fmt}; use serde::{Deserialize, Serialize}; use specta::Type; @@ -11,8 +11,8 @@ pub enum OperationKind<'a> { Delete, } -impl std::fmt::Display for OperationKind<'_> { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { +impl fmt::Display for OperationKind<'_> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { OperationKind::Create => write!(f, "c"), OperationKind::Update(field) => write!(f, "u:{field}"), @@ -36,11 +36,13 @@ pub enum CRDTOperationData { } impl CRDTOperationData { + #[must_use] pub fn create() -> Self { - Self::Create(Default::default()) + Self::Create(BTreeMap::default()) } - pub fn as_kind(&self) -> OperationKind { + #[must_use] + pub fn as_kind(&self) -> OperationKind<'_> { match self { Self::Create(_) => OperationKind::Create, Self::Update { field, .. } => OperationKind::Update(field), @@ -62,17 +64,17 @@ pub struct CRDTOperation { impl CRDTOperation { #[must_use] - pub fn kind(&self) -> OperationKind { + pub fn kind(&self) -> OperationKind<'_> { self.data.as_kind() } } -impl Debug for CRDTOperation { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { +impl fmt::Debug for CRDTOperation { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("CRDTOperation") .field("data", &self.data) .field("model", &self.model) .field("record_id", &self.record_id.to_string()) - .finish() + .finish_non_exhaustive() } } diff --git a/crates/sync/src/lib.rs b/crates/sync/src/lib.rs index c77aef736..3d5eac56f 100644 --- a/crates/sync/src/lib.rs +++ b/crates/sync/src/lib.rs @@ -1,3 +1,32 @@ +#![warn( + clippy::all, + clippy::pedantic, + clippy::correctness, + clippy::perf, + clippy::style, + clippy::suspicious, + clippy::complexity, + clippy::nursery, + clippy::unwrap_used, + unused_qualifications, + rust_2018_idioms, + trivial_casts, + trivial_numeric_casts, + unused_allocation, + clippy::unnecessary_cast, + clippy::cast_lossless, + clippy::cast_possible_truncation, + clippy::cast_possible_wrap, + clippy::cast_precision_loss, + clippy::cast_sign_loss, + clippy::dbg_macro, + clippy::deprecated_cfg_attr, + clippy::separated_literal_suffix, + deprecated +)] +#![forbid(deprecated_in_future)] +#![allow(clippy::missing_errors_doc, clippy::module_name_repetitions)] + mod compressed; mod crdt; mod factory;