From 4467668c6f5a55f1dea077ece49c1c8d6ac3a881 Mon Sep 17 00:00:00 2001 From: Takatoshi Kondo Date: Wed, 26 Nov 2025 13:55:03 +0900 Subject: [PATCH 1/2] Fix SubEntry code examples. Update the version to 0.7.3. --- CHANGELOG.md | 12 +++ Cargo.toml | 2 +- README.md | 16 ++-- src/lib.rs | 14 ++-- src/mqtt/packet/v3_1_1/subscribe.rs | 120 +++++++++++----------------- src/mqtt/packet/v5_0/subscribe.rs | 116 +++++++++++---------------- 6 files changed, 124 insertions(+), 156 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a2d1e92..49ab554 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,15 @@ +# 0.7.3 + +* Fix SubEntry code example. #56 +* Fix auto_map_topic_alias_send logic. #55 +* Minimize copy for MqttString and MqttBinary. #54 +* Add Option type packet_id() support for Publish packet builder. #53 +* Optionally derive defmt::Format for some types. #48 +* Avoid duplicate libraries when building with -Zbuild-std. #47 +* Fall back to Rc on targets without atomics. #46 + + + # 0.7.2 * Fix missing properties on CONNACK packet. #44 diff --git a/Cargo.toml b/Cargo.toml index 13609dc..4b08219 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mqtt-protocol-core" -version = "0.7.2" +version = "0.7.3" edition = "2021" rust-version = "1.86.0" license = "MIT" diff --git a/README.md b/README.md index cb505ef..e822f53 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ Add this to your `Cargo.toml`: ```toml [dependencies] -mqtt-protocol-core = "0.7.2" +mqtt-protocol-core = "0.7.3" ``` ### No-std Support @@ -47,7 +47,7 @@ For `no_std` environments (embedded systems), disable the default `std` feature: ```toml [dependencies] -mqtt-protocol-core = { version = "0.7.2", default-features = false } +mqtt-protocol-core = { version = "0.7.3", default-features = false } ``` Caveats: @@ -64,15 +64,15 @@ The library supports several optional features that can be enabled/disabled as n ```toml # Enable tracing support (independent of std) [dependencies] -mqtt-protocol-core = { version = "0.7.2", default-features = false, features = ["tracing"] } +mqtt-protocol-core = { version = "0.7.3", default-features = false, features = ["tracing"] } # Use with std but without tracing [dependencies] -mqtt-protocol-core = { version = "0.7.2", default-features = false, features = ["std"] } +mqtt-protocol-core = { version = "0.7.3", default-features = false, features = ["std"] } # Full-featured (std + tracing) [dependencies] -mqtt-protocol-core = { version = "0.7.2", features = ["tracing"] } +mqtt-protocol-core = { version = "0.7.3", features = ["tracing"] } ``` ### Small String Optimization (SSO) Features @@ -87,11 +87,11 @@ This crate provides SSO features to optimize memory usage for small string and b ```toml # Use specific SSO optimization level [dependencies] -mqtt-protocol-core = { version = "0.7.2", features = ["sso-lv10"] } +mqtt-protocol-core = { version = "0.7.3", features = ["sso-lv10"] } # Combine with other features [dependencies] -mqtt-protocol-core = { version = "0.7.2", features = ["std", "sso-lv20", "tracing"] } +mqtt-protocol-core = { version = "0.7.3", features = ["std", "sso-lv20", "tracing"] } ``` #### ⚠️ **Important: Feature Flag Propagation Requirement** @@ -110,7 +110,7 @@ When your crate depends on `mqtt-protocol-core` and is used by other crates or a ```toml # Your crate's Cargo.toml [dependencies] -mqtt-protocol-core = { version = "0.7.2", features = ["sso-lv10"] } +mqtt-protocol-core = { version = "0.7.3", features = ["sso-lv10"] } [features] # You MUST re-export ALL SSO features to allow downstream configuration diff --git a/src/lib.rs b/src/lib.rs index a1731f5..825e900 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -121,7 +121,7 @@ //! //! ```toml //! [dependencies] -//! mqtt-protocol-core = { version = "0.7.2", default-features = false } +//! mqtt-protocol-core = { version = "0.7.3", default-features = false } //! ``` //! //! **No-std usage example:** @@ -173,15 +173,15 @@ //! ```toml //! # Enable tracing support (independent of std) //! [dependencies] -//! mqtt-protocol-core = { version = "0.7.2", default-features = false, features = ["tracing"] } +//! mqtt-protocol-core = { version = "0.7.3", default-features = false, features = ["tracing"] } //! //! # Use with std but without tracing overhead //! [dependencies] -//! mqtt-protocol-core = { version = "0.7.2", default-features = false, features = ["std"] } +//! mqtt-protocol-core = { version = "0.7.3", default-features = false, features = ["std"] } //! //! # Full-featured (std + tracing) //! [dependencies] -//! mqtt-protocol-core = { version = "0.7.2", features = ["tracing"] } +//! mqtt-protocol-core = { version = "0.7.3", features = ["tracing"] } //! ``` //! //! ### Small String Optimization (SSO) Features @@ -208,11 +208,11 @@ //! ```toml //! # Use specific SSO optimization level //! [dependencies] -//! mqtt-protocol-core = { version = "0.7.2", features = ["sso-lv10"] } +//! mqtt-protocol-core = { version = "0.7.3", features = ["sso-lv10"] } //! //! # Combine with other features //! [dependencies] -//! mqtt-protocol-core = { version = "0.7.2", features = ["std", "sso-lv20", "tracing"] } +//! mqtt-protocol-core = { version = "0.7.3", features = ["std", "sso-lv20", "tracing"] } //! ``` //! //! #### ⚠️ **Critical: SSO Feature Flag Propagation** @@ -234,7 +234,7 @@ //! ```toml //! # Your crate's Cargo.toml //! [dependencies] -//! mqtt-protocol-core = { version = "0.7.2", features = ["sso-lv10"] } +//! mqtt-protocol-core = { version = "0.7.3", features = ["sso-lv10"] } //! //! [features] //! # MANDATORY: Re-export ALL SSO features to allow downstream configuration diff --git a/src/mqtt/packet/v3_1_1/subscribe.rs b/src/mqtt/packet/v3_1_1/subscribe.rs index e35f4d8..f9049ff 100644 --- a/src/mqtt/packet/v3_1_1/subscribe.rs +++ b/src/mqtt/packet/v3_1_1/subscribe.rs @@ -107,12 +107,10 @@ use crate::mqtt::result_code::MqttError; /// let subscribe = mqtt::packet::v3_1_1::Subscribe::builder() /// .packet_id(42) /// .entries(vec![ -/// SubEntry::builder() -/// .topic_filter("sensors/temperature") -/// .unwrap() -/// .qos(Qos::AtLeastOnce) -/// .build() -/// .unwrap() +/// SubEntry::new( +/// "sensors/temperature", +/// mqtt::packet::SubOpts::new().set_qos(Qos::AtLeastOnce) +/// )? /// ]) /// .build() /// .unwrap(); @@ -125,18 +123,14 @@ use crate::mqtt::result_code::MqttError; /// let subscribe = mqtt::packet::v3_1_1::Subscribe::builder() /// .packet_id(123) /// .entries(vec![ -/// SubEntry::builder() -/// .topic_filter("home/+/temperature") -/// .unwrap() -/// .qos(Qos::AtMostOnce) -/// .build() -/// .unwrap(), -/// SubEntry::builder() -/// .topic_filter("alerts/#") -/// .unwrap() -/// .qos(Qos::ExactlyOnce) -/// .build() -/// .unwrap() +/// SubEntry::new( +/// "home/+/temperature", +/// mqtt::packet::SubOpts::new().set_qos(Qos::AtMostOnce) +/// )?, +/// SubEntry::new( +/// "alerts/#", +/// mqtt::packet::SubOpts::new().set_qos(Qos::ExactlyOnce) +/// )? /// ]) /// .build() /// .unwrap(); @@ -180,12 +174,10 @@ where /// let subscribe = mqtt::packet::v3_1_1::Subscribe::builder() /// .packet_id(1) /// .entries(vec![ -/// SubEntry::builder() -/// .topic_filter("my/topic") -/// .unwrap() -/// .qos(Qos::AtLeastOnce) -/// .build() -/// .unwrap() +/// SubEntry::new( +/// "my/topic", +/// mqtt::packet::SubOpts::new().set_qos(Qos::AtLeastOnce) +/// )? /// ]) /// .build() /// .unwrap(); @@ -216,12 +208,10 @@ where /// let subscribe = mqtt::packet::v3_1_1::Subscribe::builder() /// .packet_id(42) /// .entries(vec![ - /// SubEntry::builder() - /// .topic_filter("sensors/+") - /// .unwrap() - /// .qos(Qos::AtLeastOnce) - /// .build() - /// .unwrap() + /// SubEntry::new( + /// "sensors/+", + /// mqtt::packet::SubOpts::new().set_qos(Qos::AtLeastOnce) + /// )? /// ]) /// .build() /// .unwrap(); @@ -272,12 +262,10 @@ where /// let subscribe = mqtt::packet::v3_1_1::Subscribe::builder() /// .packet_id(123) /// .entries(vec![ - /// SubEntry::builder() - /// .topic_filter("test/topic") - /// .unwrap() - /// .qos(Qos::AtMostOnce) - /// .build() - /// .unwrap() + /// SubEntry::new( + /// "test/topic", + /// mqtt::packet::SubOpts::new().set_qos(Qos::AtMostOnce) + /// )? /// ]) /// .build() /// .unwrap(); @@ -375,12 +363,10 @@ where /// let subscribe = mqtt::packet::v3_1_1::Subscribe::builder() /// .packet_id(1) /// .entries(vec![ - /// SubEntry::builder() - /// .topic_filter("test") - /// .unwrap() - /// .qos(Qos::AtMostOnce) - /// .build() - /// .unwrap() + /// SubEntry::new( + /// "test", + /// mqtt::packet::SubOpts::new().set_qos(Qos::AtMostOnce) + /// )? /// ]) /// .build() /// .unwrap(); @@ -416,12 +402,10 @@ where /// let subscribe = mqtt::packet::v3_1_1::Subscribe::builder() /// .packet_id(1) /// .entries(vec![ - /// SubEntry::builder() - /// .topic_filter("test/topic") - /// .unwrap() - /// .qos(Qos::AtLeastOnce) - /// .build() - /// .unwrap() + /// SubEntry::new( + /// "test/topic", + /// mqtt::packet::SubOpts::new().set_qos(Qos::AtLeastOnce) + /// )? /// ]) /// .build() /// .unwrap(); @@ -552,12 +536,10 @@ where /// let subscribe = mqtt::packet::v3_1_1::Subscribe::builder() /// .packet_id(1) /// .entries(vec![ - /// SubEntry::builder() - /// .topic_filter("sensors/temperature") - /// .unwrap() - /// .qos(Qos::AtMostOnce) - /// .build() - /// .unwrap() + /// SubEntry::new( + /// "sensors/temperature", + /// mqtt::packet::SubOpts::new().set_qos(Qos::AtMostOnce) + /// )? /// ]) /// .build() /// .unwrap(); @@ -599,12 +581,10 @@ where /// let subscribe = mqtt::packet::v3_1_1::Subscribe::builder() /// .packet_id(42) /// .entries(vec![ -/// SubEntry::builder() -/// .topic_filter("test/topic") -/// .unwrap() -/// .qos(Qos::AtLeastOnce) -/// .build() -/// .unwrap() +/// SubEntry::new( +/// "test/topic", +/// mqtt::packet::SubOpts::new().set_qos(Qos::AtLeastOnce) +/// )? /// ]) /// .build() /// .unwrap(); @@ -639,12 +619,10 @@ where /// let subscribe = mqtt::packet::v3_1_1::Subscribe::builder() /// .packet_id(1) /// .entries(vec![ -/// SubEntry::builder() -/// .topic_filter("debug/topic") -/// .unwrap() -/// .qos(Qos::AtMostOnce) -/// .build() -/// .unwrap() +/// SubEntry::new( +/// "debug/topic", +/// mqtt::packet::SubOpts::new().set_qos(Qos::AtMostOnce) +/// )? /// ]) /// .build() /// .unwrap(); @@ -682,12 +660,10 @@ where /// let subscribe = mqtt::packet::v3_1_1::Subscribe::builder() /// .packet_id(123) /// .entries(vec![ -/// SubEntry::builder() -/// .topic_filter("home/sensor") -/// .unwrap() -/// .qos(Qos::ExactlyOnce) -/// .build() -/// .unwrap() +/// SubEntry::new( +/// "home/sensor", +/// mqtt::packet::SubOpts::new().set_qos(Qos::ExactlyOnce) +/// )? /// ]) /// .build() /// .unwrap(); diff --git a/src/mqtt/packet/v5_0/subscribe.rs b/src/mqtt/packet/v5_0/subscribe.rs index ee6186a..c9a93dd 100644 --- a/src/mqtt/packet/v5_0/subscribe.rs +++ b/src/mqtt/packet/v5_0/subscribe.rs @@ -116,12 +116,10 @@ use crate::mqtt::result_code::MqttError; /// let subscribe = mqtt::packet::v5_0::Subscribe::builder() /// .packet_id(42) /// .entries(vec![ -/// SubEntry::builder() -/// .topic_filter("sensors/temperature") -/// .unwrap() -/// .qos(Qos::AtLeastOnce) -/// .build() -/// .unwrap() +/// SubEntry::new( +/// "sensors/temperature", +/// mqtt::packet::SubOpts::new().set_qos(Qos::AtLeastOnce) +/// )? /// ]) /// .build() /// .unwrap(); @@ -134,19 +132,16 @@ use crate::mqtt::result_code::MqttError; /// let subscribe = mqtt::packet::v5_0::Subscribe::builder() /// .packet_id(123) /// .entries(vec![ -/// SubEntry::builder() -/// .topic_filter("home/+/temperature") -/// .unwrap() -/// .qos(Qos::AtMostOnce) -/// .build() -/// .unwrap(), -/// SubEntry::builder() -/// .topic_filter("alerts/#") -/// .unwrap() -/// .qos(Qos::ExactlyOnce) -/// .no_local(true) -/// .build() -/// .unwrap() +/// SubEntry::new( +/// "home/+/temperature", +/// mqtt::packet::SubOpts::new().set_qos(Qos::AtMostOnce) +/// )?, +/// SubEntry::new( +/// "alerts/#", +/// mqtt::packet::SubOpts::new() +/// .set_qos(Qos::ExactlyOnce) +/// .set_nl(true) +/// )? /// ]) /// .build() /// .unwrap(); @@ -196,12 +191,10 @@ where /// let subscribe = mqtt::packet::v5_0::Subscribe::builder() /// .packet_id(1) /// .entries(vec![ -/// SubEntry::builder() -/// .topic_filter("my/topic") -/// .unwrap() -/// .qos(Qos::AtLeastOnce) -/// .build() -/// .unwrap() +/// SubEntry::new( +/// "my/topic", +/// mqtt::packet::SubOpts::new().set_qos(Qos::AtLeastOnce) +/// )? /// ]) /// .build() /// .unwrap(); @@ -232,13 +225,12 @@ where /// let subscribe = mqtt::packet::v5_0::Subscribe::builder() /// .packet_id(42) /// .entries(vec![ - /// SubEntry::builder() - /// .topic_filter("sensors/+") - /// .unwrap() - /// .qos(Qos::AtLeastOnce) - /// .no_local(true) - /// .build() - /// .unwrap() + /// SubEntry::new( + /// "sensors/+", + /// mqtt::packet::SubOpts::new() + /// .set_qos(Qos::AtLeastOnce) + /// .set_nl(true) + /// )? /// ]) /// .build() /// .unwrap(); @@ -289,12 +281,10 @@ where /// let subscribe = mqtt::packet::v5_0::Subscribe::builder() /// .packet_id(123) /// .entries(vec![ - /// SubEntry::builder() - /// .topic_filter("test/topic") - /// .unwrap() - /// .qos(Qos::AtMostOnce) - /// .build() - /// .unwrap() + /// SubEntry::new( + /// "test/topic", + /// mqtt::packet::SubOpts::new().set_qos(Qos::AtMostOnce) + /// )? /// ]) /// .build() /// .unwrap(); @@ -400,12 +390,10 @@ where /// let subscribe = mqtt::packet::v5_0::Subscribe::builder() /// .packet_id(1) /// .entries(vec![ - /// SubEntry::builder() - /// .topic_filter("test") - /// .unwrap() - /// .qos(Qos::AtMostOnce) - /// .build() - /// .unwrap() + /// SubEntry::new( + /// "test", + /// mqtt::packet::SubOpts::new().set_qos(Qos::AtMostOnce) + /// )? /// ]) /// .build() /// .unwrap(); @@ -613,12 +601,10 @@ where /// let subscribe = mqtt::packet::v5_0::Subscribe::builder() /// .packet_id(1) /// .entries(vec![ - /// SubEntry::builder() - /// .topic_filter("sensors/temperature") - /// .unwrap() - /// .qos(Qos::AtMostOnce) - /// .build() - /// .unwrap() + /// SubEntry::new( + /// "sensors/temperature", + /// mqtt::packet::SubOpts::new().set_qos(Qos::AtMostOnce) + /// )? /// ]) /// .build() /// .unwrap(); @@ -667,12 +653,10 @@ where /// let subscribe = mqtt::packet::v5_0::Subscribe::builder() /// .packet_id(42) /// .entries(vec![ -/// SubEntry::builder() -/// .topic_filter("test/topic") -/// .unwrap() -/// .qos(Qos::AtLeastOnce) -/// .build() -/// .unwrap() +/// SubEntry::new( +/// "test/topic", +/// mqtt::packet::SubOpts::new().set_qos(Qos::AtLeastOnce) +/// )? /// ]) /// .build() /// .unwrap(); @@ -707,12 +691,10 @@ where /// let subscribe = mqtt::packet::v5_0::Subscribe::builder() /// .packet_id(1) /// .entries(vec![ -/// SubEntry::builder() -/// .topic_filter("debug/topic") -/// .unwrap() -/// .qos(Qos::AtMostOnce) -/// .build() -/// .unwrap() +/// SubEntry::new( +/// "debug/topic", +/// mqtt::packet::SubOpts::new().set_qos(Qos::AtMostOnce) +/// )? /// ]) /// .build() /// .unwrap(); @@ -751,12 +733,10 @@ where /// let subscribe = mqtt::packet::v5_0::Subscribe::builder() /// .packet_id(123) /// .entries(vec![ -/// SubEntry::builder() -/// .topic_filter("home/sensor") -/// .unwrap() -/// .qos(Qos::ExactlyOnce) -/// .build() -/// .unwrap() +/// SubEntry::new( +/// "home/sensor", +/// mqtt::packet::SubOpts::new().set_qos(Qos::ExactlyOnce) +/// )? /// ]) /// .build() /// .unwrap(); From 7ba8636ea09caba53317d85d19d3670170aed5e2 Mon Sep 17 00:00:00 2001 From: Takatoshi Kondo Date: Wed, 26 Nov 2025 14:26:12 +0900 Subject: [PATCH 2/2] Reduce CI disk usage. --- .github/workflows/ci.yml | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 42aa809..9ea668c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,6 +20,23 @@ jobs: steps: - uses: actions/checkout@v4 + - name: Free Disk Space (Ubuntu) + if: runner.os == 'Linux' + uses: jlumbroso/free-disk-space@main + with: + # this might remove tools that are actually needed, + # if set to "true" but frees about 6 GB + tool-cache: false + + # all of these default to true, but feel free to set to + # "false" if necessary for your workflow + android: true + dotnet: true + haskell: true + large-packages: true + docker-images: true + swap-storage: true + - name: Install Rust uses: dtolnay/rust-toolchain@stable with: @@ -76,6 +93,9 @@ jobs: - name: Run tests (no-std + tracing, no SSO) run: cargo test --verbose --no-default-features --features tracing -- --nocapture + - name: Clean build artifacts before SSO tests + run: cargo clean + - name: Run tests with SSO features run: | cargo test --verbose --features std,sso-min-32bit -- --nocapture @@ -98,6 +118,17 @@ jobs: steps: - uses: actions/checkout@v4 + - name: Free Disk Space + uses: jlumbroso/free-disk-space@main + with: + tool-cache: false + android: true + dotnet: true + haskell: true + large-packages: true + docker-images: true + swap-storage: true + - name: Install Rust uses: dtolnay/rust-toolchain@stable