From 138c9b56ae957458cdf71ad00412c53c0948b2db Mon Sep 17 00:00:00 2001 From: Matteo Merli Date: Wed, 24 Jun 2026 12:43:06 -0700 Subject: [PATCH] fix: silence pulsar warnings under no-compression feature sets Building the pulsar crate without the `compression` feature (e.g. `--no-default-features --features tokio-runtime`) produces three warnings that are masked under the default feature set, which enables `compression`: - unused `io::Write` import in producer.rs - unnecessary `mut` on compress_message's `message` parameter - unnecessary `mut` on process_payload's `payload` parameter Gate the import and the `mut` bindings on the individual compression sub-features (lz4/flate2/zstd/snap) that actually use them, so the crate is warning-free across every feature combination -- including single-sub-feature builds like `--features lz4` -- without changing behavior under any feature. `io::Write` moves into the flate2/snap match arms, matching the existing `use std::io::Read;` convention in engine.rs. --- src/consumer/engine.rs | 12 +++++++++++- src/producer.rs | 17 +++++++++++++++-- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/consumer/engine.rs b/src/consumer/engine.rs index 46144205..3d3d92cb 100644 --- a/src/consumer/engine.rs +++ b/src/consumer/engine.rs @@ -437,8 +437,18 @@ impl ConsumerEngine { async fn process_payload( &mut self, message: CommandMessage, - mut payload: Payload, + payload: Payload, ) -> Result<(), Error> { + // Only the compression arms below mutate `payload`; without any of those + // features the binding stays immutable, so gate the `mut` to avoid an + // `unused_mut` warning. + #[cfg(any( + feature = "lz4", + feature = "flate2", + feature = "zstd", + feature = "snap" + ))] + let mut payload = payload; let compression = match payload.metadata.compression { None => proto::CompressionType::None, Some(compression) => proto::CompressionType::try_from(compression).map_err(|err| { diff --git a/src/producer.rs b/src/producer.rs index b21790f1..5f31d1ce 100644 --- a/src/producer.rs +++ b/src/producer.rs @@ -1,7 +1,6 @@ //! Message publication use std::{ collections::{btree_map::Entry, BTreeMap, HashMap, VecDeque}, - io::Write, pin::Pin, sync::{ atomic::{AtomicU64, Ordering}, @@ -832,9 +831,19 @@ impl TopicProducer { #[cfg_attr(feature = "telemetry", tracing::instrument(skip_all))] fn compress_message( - mut message: ProducerMessage, + message: ProducerMessage, compression: &Option, ) -> Result { + // Only the compression arms below mutate `message`; without any of those + // features the binding stays immutable, so gate the `mut` to avoid an + // `unused_mut` warning. + #[cfg(any( + feature = "lz4", + feature = "flate2", + feature = "zstd", + feature = "snap" + ))] + let mut message = message; let compressed_message = match compression { None | Some(Compression::None) => message, #[cfg(feature = "lz4")] @@ -850,6 +859,8 @@ fn compress_message( } #[cfg(feature = "flate2")] Some(Compression::Zlib(compression)) => { + use std::io::Write; + let mut e = flate2::write::ZlibEncoder::new(Vec::new(), compression.level); e.write_all(&message.payload[..]) .map_err(ProducerError::Io)?; @@ -871,6 +882,8 @@ fn compress_message( } #[cfg(feature = "snap")] Some(Compression::Snappy(..)) => { + use std::io::Write; + let mut compressed_payload = Vec::new(); { let mut encoder = snap::write::FrameEncoder::new(&mut compressed_payload);