diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 335e9c7..4d1b38c 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -34,14 +34,14 @@ jobs: run: cargo test --verbose --all-features msrv: - name: Verify MSRV (1.85) + name: Verify MSRV (1.99) runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - name: Install Rust Toolchain (1.85) - uses: dtolnay/rust-toolchain@1.85.0 + - name: Install Rust Toolchain (1.99) + uses: dtolnay/rust-toolchain@1.99.0 - name: Check run: cargo check --all-features diff --git a/CHANGELOG.md b/CHANGELOG.md index c8d5d59..b227e1c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,13 @@ All notable changes to this project are documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.3.0] - 2026-10-08 + +### Changed + +- Raised the `multi-hash` requirement 1.1.2 → 2.0 and migrated the tests, benchmarks, and doc examples from the removed `Builder::new_from_bytes` API to the streaming builder shape (`Builder::new(codec)?` + `update(bytes)` + `try_build()`). The crate requires multi-hash 2.0.0, which declares `rust-version = "1.99"`. No public API changes. +- Raised the MSRV from 1.85 to 1.99 and applied clippy 0.1.99 fixes. + ## [0.2.0] - 2026-08-18 ### Changed @@ -56,6 +63,8 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm - The `multi-base`, `multi-codec`, `multi-hash`, `multi-trait`, and `multi-util` dependencies use the published crates.io versions. +[0.3.0]: https://github.com/cryptidtech/multi-cid/releases/tag/v0.3.0 + [0.2.0]: https://github.com/cryptidtech/multi-cid/releases/tag/v0.2.0 [0.1.0]: https://github.com/cryptidtech/multi-cid/releases/tag/v0.1.0 diff --git a/Cargo.toml b/Cargo.toml index 88fe490..3cd0561 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "multi-cid" -version = "0.2.0" +version = "0.3.0" edition = "2021" -rust-version = "1.85" +rust-version = "1.99" authors = ["Dave Grantham "] description = "Content Identifier (CID) implementation compatible with IPFS and IPLD" repository = "https://github.com/cryptidtech/multi-cid.git" @@ -16,12 +16,12 @@ default = ["serde", "dag_cbor"] dag_cbor = ["dep:multi-cbor", "multi-cbor/tags"] [dependencies] -multi-base = { version = "1.0", default-features = false } -multi-cbor = { version = "0.1", optional = true } -multi-codec = "1.2" -multi-hash = "1.1.2" -multi-trait = { version = "1.0", default-features = false } -multi-util = "1.1" +multi-base = { version = "1.1", default-features = false } +multi-cbor = { version = "0.2", optional = true } +multi-codec = "1.6" +multi-hash = "2.0" +multi-trait = { version = "1.1", default-features = false } +multi-util = "1.2" thiserror = "2.0" serde = { version = "1.0", default-features = false, features = [ "alloc", @@ -31,7 +31,7 @@ serde = { version = "1.0", default-features = false, features = [ [dev-dependencies] criterion = "0.8" hex = "0.4" -multi-cbor = "0.1" +multi-cbor = "0.2" proptest = "1.11" serde_json = "1.0" serde_test = "1.0" diff --git a/README.md b/README.md index 2e3302b..21239ef 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ For DAG-CBOR tag 42 support: multi-cid = { version = "0.1", features = ["dag_cbor"] } ``` -MSRV: Rust 1.85 (Edition 2021). +MSRV: Rust 1.99 (Edition 2021). ## Usage @@ -63,10 +63,9 @@ use multi_codec::Codec; use multi_hash::Builder as MhBuilder; // Create a multihash -let hash = MhBuilder::new_from_bytes(Codec::Sha2256, b"hello world") - .unwrap() - .try_build() - .unwrap(); +let mut hasher = MhBuilder::new(Codec::Sha2256).unwrap(); +hasher.update(b"hello world"); +let hash = hasher.try_build().unwrap(); // Create a CID v1 let cid = cid::Builder::new(Codec::Sha2256) diff --git a/benches/multicid_bench.rs b/benches/multicid_bench.rs index 3bf35da..ab3dff1 100644 --- a/benches/multicid_bench.rs +++ b/benches/multicid_bench.rs @@ -10,10 +10,9 @@ use std::hint::black_box; /// Benchmark CID encoding fn bench_cid_encoding(c: &mut Criterion) { - let hash = MhBuilder::new_from_bytes(Codec::Sha2256, b"benchmark data") - .unwrap() - .try_build() - .unwrap(); + let mut hasher = MhBuilder::new(Codec::Sha2256).unwrap(); + hasher.update(b"benchmark data"); + let hash = hasher.try_build().unwrap(); let cid = cid::Builder::new(Codec::Cidv1) .with_target_codec(Codec::DagCbor) @@ -30,10 +29,9 @@ fn bench_cid_encoding(c: &mut Criterion) { /// Benchmark CID decoding fn bench_cid_decoding(c: &mut Criterion) { - let hash = MhBuilder::new_from_bytes(Codec::Sha2256, b"benchmark data") - .unwrap() - .try_build() - .unwrap(); + let mut hasher = MhBuilder::new(Codec::Sha2256).unwrap(); + hasher.update(b"benchmark data"); + let hash = hasher.try_build().unwrap(); let cid = cid::Builder::new(Codec::Cidv1) .with_target_codec(Codec::DagCbor) diff --git a/src/cid.rs b/src/cid.rs index 66186b2..082f2a4 100644 --- a/src/cid.rs +++ b/src/cid.rs @@ -313,13 +313,10 @@ mod tests { #[test] fn test_v0() { + let mut hasher = mh::Builder::new(Codec::Sha2256).unwrap(); + hasher.update(b"for great justice, move every zig!"); let v0 = Builder::default() - .with_hash( - &mh::Builder::new_from_bytes(Codec::Sha2256, b"for great justice, move every zig!") - .unwrap() - .try_build() - .unwrap(), - ) + .with_hash(&hasher.try_build().unwrap()) .try_build() .unwrap(); @@ -371,13 +368,10 @@ mod tests { #[test] fn test_v0_binary_roundtrip() { + let mut hasher = mh::Builder::new(Codec::Sha2256).unwrap(); + hasher.update(b"for great justice, move every zig!"); let v0 = Builder::default() - .with_hash( - &mh::Builder::new_from_bytes(Codec::Sha2256, b"for great justice, move every zig!") - .unwrap() - .try_build() - .unwrap(), - ) + .with_hash(&hasher.try_build().unwrap()) .try_build() .unwrap(); let v: Vec = v0.clone().into(); @@ -386,13 +380,10 @@ mod tests { #[test] fn test_v0_encoded_roundtrip() { + let mut hasher = mh::Builder::new(Codec::Sha2256).unwrap(); + hasher.update(b"for great justice, move every zig!"); let v0 = Builder::default() - .with_hash( - &mh::Builder::new_from_bytes(Codec::Sha2256, b"for great justice, move every zig!") - .unwrap() - .try_build() - .unwrap(), - ) + .with_hash(&hasher.try_build().unwrap()) .try_build_legacy_encoded() .unwrap(); let s = v0.to_string(); @@ -402,14 +393,11 @@ mod tests { #[test] fn test_v1() { + let mut hasher = mh::Builder::new(Codec::Sha3512).unwrap(); + hasher.update(b"for great justice, move every zig!"); let v1 = Builder::new(Codec::Cidv1) .with_target_codec(Codec::DagCbor) - .with_hash( - &mh::Builder::new_from_bytes(Codec::Sha3512, b"for great justice, move every zig!") - .unwrap() - .try_build() - .unwrap(), - ) + .with_hash(&hasher.try_build().unwrap()) .try_build() .unwrap(); @@ -420,14 +408,11 @@ mod tests { #[test] fn test_v1_binary_roundtrip() { + let mut hasher = mh::Builder::new(Codec::Sha3512).unwrap(); + hasher.update(b"for great justice, move every zig!"); let v1 = Builder::new(Codec::Cidv1) .with_target_codec(Codec::DagCbor) - .with_hash( - &mh::Builder::new_from_bytes(Codec::Sha3512, b"for great justice, move every zig!") - .unwrap() - .try_build() - .unwrap(), - ) + .with_hash(&hasher.try_build().unwrap()) .try_build() .unwrap(); let v: Vec = v1.clone().into(); @@ -436,15 +421,12 @@ mod tests { #[test] fn test_v1_encoded_roundtrip() { + let mut hasher = mh::Builder::new(Codec::Sha3256).unwrap(); + hasher.update(b"for great justice, move every zig!"); let v1 = Builder::new(Codec::Cidv1) .with_target_codec(Codec::DagCbor) .with_base_encoding(Base::Base32Lower) - .with_hash( - &mh::Builder::new_from_bytes(Codec::Sha3256, b"for great justice, move every zig!") - .unwrap() - .try_build() - .unwrap(), - ) + .with_hash(&hasher.try_build().unwrap()) .try_build_encoded() .unwrap(); let s = v1.to_string(); diff --git a/src/lib.rs b/src/lib.rs index 8337674..1b7bcf7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -29,10 +29,9 @@ //! use multi_hash::Builder as MhBuilder; //! //! // Create a multihash -//! let hash = MhBuilder::new_from_bytes(Codec::Sha2256, b"hello world") -//! .unwrap() -//! .try_build() -//! .unwrap(); +//! let mut hasher = MhBuilder::new(Codec::Sha2256).unwrap(); +//! hasher.update(b"hello world"); +//! let hash = hasher.try_build().unwrap(); //! //! // Create a CID v1 //! let cid = cid::Builder::new(Codec::Sha2256) @@ -49,10 +48,9 @@ //! use multi_codec::Codec; //! use multi_hash::Builder as MhBuilder; //! -//! let hash = MhBuilder::new_from_bytes(Codec::Sha2256, b"data") -//! .unwrap() -//! .try_build() -//! .unwrap(); +//! let mut hasher = MhBuilder::new(Codec::Sha2256).unwrap(); +//! hasher.update(b"data"); +//! let hash = hasher.try_build().unwrap(); //! //! let cid = cid::Builder::new(Codec::Sha2256) //! .with_target_codec(Codec::DagCbor) @@ -107,10 +105,9 @@ pub mod serde; /// use multi_cid::prelude::*; /// use multi_hash::Builder as MhBuilder; /// -/// let hash = MhBuilder::new_from_bytes(Codec::Sha2256, b"test") -/// .unwrap() -/// .try_build() -/// .unwrap(); +/// let mut hasher = MhBuilder::new(Codec::Sha2256).unwrap(); +/// hasher.update(b"test"); +/// let hash = hasher.try_build().unwrap(); /// let cid = cid::Builder::new(Codec::Sha2256) /// .with_target_codec(Codec::DagCbor) /// .with_hash(&hash) diff --git a/src/serde/mod.rs b/src/serde/mod.rs index 3f227a9..530de3b 100644 --- a/src/serde/mod.rs +++ b/src/serde/mod.rs @@ -13,13 +13,10 @@ mod tests { #[test] fn test_cidv0_serde_encoded_string() { + let mut hasher = mh::Builder::new(Codec::Sha2256).unwrap(); + hasher.update(b"for great justice, move every zig!"); let v0 = cid::Builder::default() - .with_hash( - &mh::Builder::new_from_bytes(Codec::Sha2256, b"for great justice, move every zig!") - .unwrap() - .try_build() - .unwrap(), - ) + .with_hash(&hasher.try_build().unwrap()) .try_build_legacy_encoded() .unwrap(); @@ -33,13 +30,10 @@ mod tests { #[test] fn test_cidv0_serde_readable() { + let mut hasher = mh::Builder::new(Codec::Sha2256).unwrap(); + hasher.update(b"for great justice, move every zig!"); let v0 = cid::Builder::default() - .with_hash( - &mh::Builder::new_from_bytes(Codec::Sha2256, b"for great justice, move every zig!") - .unwrap() - .try_build() - .unwrap(), - ) + .with_hash(&hasher.try_build().unwrap()) .try_build() .unwrap(); @@ -73,13 +67,10 @@ mod tests { #[test] fn test_cidv0_serde_json() { + let mut hasher = mh::Builder::new(Codec::Sha2256).unwrap(); + hasher.update(b"for great justice, move every zig!"); let v0 = cid::Builder::default() - .with_hash( - &mh::Builder::new_from_bytes(Codec::Sha2256, b"for great justice, move every zig!") - .unwrap() - .try_build() - .unwrap(), - ) + .with_hash(&hasher.try_build().unwrap()) .try_build() .unwrap(); @@ -91,13 +82,10 @@ mod tests { #[cfg(not(feature = "dag_cbor"))] #[test] fn test_cidv0_serde_cbor() { + let mut hasher = mh::Builder::new(Codec::Sha2256).unwrap(); + hasher.update(b"for great justice, move every zig!"); let v0 = cid::Builder::default() - .with_hash( - &mh::Builder::new_from_bytes(Codec::Sha2256, b"for great justice, move every zig!") - .unwrap() - .try_build() - .unwrap(), - ) + .with_hash(&hasher.try_build().unwrap()) .try_build() .unwrap(); @@ -113,13 +101,10 @@ mod tests { #[cfg(feature = "dag_cbor")] #[test] fn test_cidv0_serde_dag_cbor() { + let mut hasher = mh::Builder::new(Codec::Sha2256).unwrap(); + hasher.update(b"for great justice, move every zig!"); let v0 = cid::Builder::default() - .with_hash( - &mh::Builder::new_from_bytes(Codec::Sha2256, b"for great justice, move every zig!") - .unwrap() - .try_build() - .unwrap(), - ) + .with_hash(&hasher.try_build().unwrap()) .try_build() .unwrap(); @@ -136,14 +121,11 @@ mod tests { #[test] fn test_cidv1_serde_encoded_string() { + let mut hasher = mh::Builder::new(Codec::Sha3512).unwrap(); + hasher.update(b"for great justice, move every zig!"); let v1 = cid::Builder::new(Codec::Cidv1) .with_target_codec(Codec::DagCbor) - .with_hash( - &mh::Builder::new_from_bytes(Codec::Sha3512, b"for great justice, move every zig!") - .unwrap() - .try_build() - .unwrap(), - ) + .with_hash(&hasher.try_build().unwrap()) .try_build_encoded() .unwrap(); @@ -157,14 +139,11 @@ mod tests { #[test] fn test_cidv1_serde_readable() { + let mut hasher = mh::Builder::new(Codec::Sha3512).unwrap(); + hasher.update(b"for great justice, move every zig!"); let v1 = cid::Builder::new(Codec::Cidv1) .with_target_codec(Codec::DagCbor) - .with_hash( - &mh::Builder::new_from_bytes(Codec::Sha3512, b"for great justice, move every zig!") - .unwrap() - .try_build() - .unwrap(), - ) + .with_hash(&hasher.try_build().unwrap()) .try_build() .unwrap(); @@ -194,14 +173,11 @@ mod tests { #[cfg(not(feature = "dag_cbor"))] #[test] fn test_cidv1_serde_cbor() { + let mut hasher = mh::Builder::new(Codec::Sha2256).unwrap(); + hasher.update(b"for great justice, move every zig!"); let v1 = cid::Builder::new(Codec::Cidv1) .with_target_codec(Codec::Raw) - .with_hash( - &mh::Builder::new_from_bytes(Codec::Sha2256, b"for great justice, move every zig!") - .unwrap() - .try_build() - .unwrap(), - ) + .with_hash(&hasher.try_build().unwrap()) .try_build() .unwrap(); @@ -219,14 +195,11 @@ mod tests { #[cfg(feature = "dag_cbor")] #[test] fn test_cidv1_serde_dag_cbor() { + let mut hasher = mh::Builder::new(Codec::Sha2256).unwrap(); + hasher.update(b"for great justice, move every zig!"); let v1 = cid::Builder::new(Codec::Cidv1) .with_target_codec(Codec::Raw) - .with_hash( - &mh::Builder::new_from_bytes(Codec::Sha2256, b"for great justice, move every zig!") - .unwrap() - .try_build() - .unwrap(), - ) + .with_hash(&hasher.try_build().unwrap()) .try_build() .unwrap();