diff --git a/Cargo.lock b/Cargo.lock
index eb1becc1f..0ab71916e 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -228,7 +228,7 @@ name = "automation"
version = "0.1.0"
dependencies = [
"duct",
- "ohno 0.3.2",
+ "ohno 0.4.0",
"serde",
"serde_json",
]
@@ -292,21 +292,21 @@ dependencies = [
[[package]]
name = "bytesbuf_io"
-version = "0.4.0"
+version = "0.5.0"
dependencies = [
"bytesbuf",
"futures",
"futures-core",
"mutants",
"new_zealand",
- "ohno 0.3.2",
+ "ohno 0.4.0",
"testing_aids",
"trait-variant",
]
[[package]]
name = "cachet"
-version = "0.1.0"
+version = "0.2.0"
dependencies = [
"alloc_tracker",
"anyspawn",
@@ -317,7 +317,7 @@ dependencies = [
"dynosaur",
"futures",
"layered",
- "ohno 0.3.2",
+ "ohno 0.4.0",
"opentelemetry",
"opentelemetry_sdk",
"parking_lot",
@@ -336,7 +336,7 @@ dependencies = [
[[package]]
name = "cachet_memory"
-version = "0.1.0"
+version = "0.2.0"
dependencies = [
"cachet_tier",
"criterion",
@@ -344,7 +344,7 @@ dependencies = [
"futures",
"moka",
"mutants",
- "ohno 0.3.2",
+ "ohno 0.4.0",
"thread_aware",
"tick",
"tokio",
@@ -352,7 +352,7 @@ dependencies = [
[[package]]
name = "cachet_service"
-version = "0.1.0"
+version = "0.2.0"
dependencies = [
"cachet_tier",
"layered",
@@ -361,10 +361,10 @@ dependencies = [
[[package]]
name = "cachet_tier"
-version = "0.1.0"
+version = "0.2.0"
dependencies = [
"dynosaur",
- "ohno 0.3.2",
+ "ohno 0.4.0",
"parking_lot",
"recoverable",
"tick",
@@ -1095,7 +1095,7 @@ dependencies = [
[[package]]
name = "http_extensions"
-version = "0.3.1"
+version = "0.4.0"
dependencies = [
"alloc_tracker",
"bytes",
@@ -1110,7 +1110,7 @@ dependencies = [
"hyper-util",
"layered",
"mutants",
- "ohno 0.3.2",
+ "ohno 0.4.0",
"pin-project",
"recoverable",
"serde",
@@ -1552,7 +1552,7 @@ dependencies = [
[[package]]
name = "ohno"
-version = "0.3.2"
+version = "0.4.0"
dependencies = [
"futures",
"insta",
@@ -1925,7 +1925,7 @@ name = "recoverable"
version = "0.1.2"
dependencies = [
"insta",
- "ohno 0.3.2",
+ "ohno 0.4.0",
"static_assertions",
"testing_aids",
]
@@ -2080,7 +2080,7 @@ dependencies = [
"jiff",
"layered",
"mutants",
- "ohno 0.3.2",
+ "ohno 0.4.0",
"opentelemetry",
"opentelemetry-stdout",
"opentelemetry_sdk",
@@ -2304,12 +2304,12 @@ dependencies = [
[[package]]
name = "templated_uri"
-version = "0.1.2"
+version = "0.2.0"
dependencies = [
"data_privacy",
"http",
"mutants",
- "ohno 0.3.2",
+ "ohno 0.4.0",
"pct-str",
"serde",
"serde_json",
@@ -2336,7 +2336,7 @@ dependencies = [
"darling",
"insta",
"mutants",
- "ohno 0.3.2",
+ "ohno 0.4.0",
"prettyplease",
"proc-macro2",
"quote",
@@ -2442,7 +2442,7 @@ dependencies = [
"insta",
"jiff",
"mutants",
- "ohno 0.3.2",
+ "ohno 0.4.0",
"pin-project-lite",
"serde",
"serde_core",
diff --git a/Cargo.toml b/Cargo.toml
index a2b7cbefa..b8bb12fad 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -25,24 +25,24 @@ homepage = "https://github.com/microsoft/oxidizer"
# local dependencies
anyspawn = { path = "crates/anyspawn", default-features = false, version = "0.3.0" }
bytesbuf = { path = "crates/bytesbuf", default-features = false, version = "0.4.2" }
-bytesbuf_io = { path = "crates/bytesbuf_io", default-features = false, version = "0.4.0" }
-cachet = { path = "crates/cachet", default-features = false, version = "0.1.0" }
-cachet_memory = { path = "crates/cachet_memory", default-features = false, version = "0.1.0" }
-cachet_service = { path = "crates/cachet_service", default-features = false, version = "0.1.0" }
-cachet_tier = { path = "crates/cachet_tier", default-features = false, version = "0.1.0" }
+bytesbuf_io = { path = "crates/bytesbuf_io", default-features = false, version = "0.5.0" }
+cachet = { path = "crates/cachet", default-features = false, version = "0.2.0" }
+cachet_memory = { path = "crates/cachet_memory", default-features = false, version = "0.2.0" }
+cachet_service = { path = "crates/cachet_service", default-features = false, version = "0.2.0" }
+cachet_tier = { path = "crates/cachet_tier", default-features = false, version = "0.2.0" }
data_privacy = { path = "crates/data_privacy", default-features = false, version = "0.11.0" }
data_privacy_macros = { path = "crates/data_privacy_macros", default-features = false, version = "0.9.0" }
data_privacy_macros_impl = { path = "crates/data_privacy_macros_impl", default-features = false, version = "0.9.0" }
fundle = { path = "crates/fundle", default-features = false, version = "0.3.0" }
fundle_macros = { path = "crates/fundle_macros", default-features = false, version = "0.3.0" }
fundle_macros_impl = { path = "crates/fundle_macros_impl", default-features = false, version = "0.3.0" }
-http_extensions = { path = "crates/http_extensions", default-features = false, version = "0.3.1" }
+http_extensions = { path = "crates/http_extensions", default-features = false, version = "0.4.0" }
layered = { path = "crates/layered", default-features = false, version = "0.3.0" }
-ohno = { path = "crates/ohno", default-features = false, version = "0.3.2" }
+ohno = { path = "crates/ohno", default-features = false, version = "0.4.0" }
ohno_macros = { path = "crates/ohno_macros", default-features = false, version = "0.3.0" }
recoverable = { path = "crates/recoverable", default-features = false, version = "0.1.2" }
seatbelt = { path = "crates/seatbelt", default-features = false, version = "0.4.4" }
-templated_uri = { path = "crates/templated_uri", default-features = false, version = "0.1.2" }
+templated_uri = { path = "crates/templated_uri", default-features = false, version = "0.2.0" }
templated_uri_macros = { path = "crates/templated_uri_macros", default-features = false, version = "0.1.1" }
templated_uri_macros_impl = { path = "crates/templated_uri_macros_impl", default-features = false, version = "0.1.1" }
testing_aids = { path = "crates/testing_aids", default-features = false }
diff --git a/crates/bytesbuf_io/CHANGELOG.md b/crates/bytesbuf_io/CHANGELOG.md
index ff97a3bfa..b6d5222ff 100644
--- a/crates/bytesbuf_io/CHANGELOG.md
+++ b/crates/bytesbuf_io/CHANGELOG.md
@@ -1,5 +1,11 @@
# Changelog
+## [0.5.0] - 2026-04-20
+
+- ⚠️ Breaking
+
+ - bump `ohno` to 0.4.0
+
## [0.3.0] - 2026-02-16
- ✔️ Tasks
diff --git a/crates/bytesbuf_io/Cargo.toml b/crates/bytesbuf_io/Cargo.toml
index 8bea9e5ab..1d251da04 100644
--- a/crates/bytesbuf_io/Cargo.toml
+++ b/crates/bytesbuf_io/Cargo.toml
@@ -4,7 +4,7 @@
[package]
name = "bytesbuf_io"
description = "Asynchronous I/O abstractions expressed via `bytesbuf` types."
-version = "0.4.0"
+version = "0.5.0"
readme = "README.md"
keywords = ["oxidizer", "io", "zero-copy", "performance", "async"]
categories = [
diff --git a/crates/bytesbuf_io/README.md b/crates/bytesbuf_io/README.md
index 379db23b2..b91e72d82 100644
--- a/crates/bytesbuf_io/README.md
+++ b/crates/bytesbuf_io/README.md
@@ -35,9 +35,9 @@ types that produce or consume streams of bytes. These are in the `testing` modul
This crate was developed as part of The Oxidizer Project. Browse this crate's source code.
- [__cargo_doc2readme_dependencies_info]: ggGkYW0CYXSEGy4k8ldDFPOhG2VNeXtD5nnKG6EPY6OfW5wBG8g18NOFNdxpYXKEG8wC2qKB5vPMG5c8vZ8ulsvSGwSlXV9Pnjr5GyAAXY8thjNKYWSBgmtieXRlc2J1Zl9pb2UwLjQuMA
+ [__cargo_doc2readme_dependencies_info]: ggGkYW0CYXSEGy4k8ldDFPOhG2VNeXtD5nnKG6EPY6OfW5wBG8g18NOFNdxpYXKEG8wC2qKB5vPMG5c8vZ8ulsvSGwSlXV9Pnjr5GyAAXY8thjNKYWSBgmtieXRlc2J1Zl9pb2UwLjUuMA
[__link0]: https://docs.io/bytesbuf
- [__link1]: https://docs.rs/bytesbuf_io/0.4.0/bytesbuf_io/?search=Read
- [__link2]: https://docs.rs/bytesbuf_io/0.4.0/bytesbuf_io/?search=Write
+ [__link1]: https://docs.rs/bytesbuf_io/0.5.0/bytesbuf_io/?search=Read
+ [__link2]: https://docs.rs/bytesbuf_io/0.5.0/bytesbuf_io/?search=Write
[__link3]: https://docs.io/bytesbuf
- [__link4]: https://docs.rs/bytesbuf_io/0.4.0/bytesbuf_io/?search=Read
+ [__link4]: https://docs.rs/bytesbuf_io/0.5.0/bytesbuf_io/?search=Read
diff --git a/crates/cachet/CHANGELOG.md b/crates/cachet/CHANGELOG.md
index 2fcbf5dd9..bbbd18fce 100644
--- a/crates/cachet/CHANGELOG.md
+++ b/crates/cachet/CHANGELOG.md
@@ -1,5 +1,11 @@
# Changelog
+## [0.2.0] - 2026-04-20
+
+- ⚠️ Breaking
+
+ - bump `ohno` to 0.4.0 and `cachet_tier` to 0.2.0
+
## [0.1.0]
Initial release.
diff --git a/crates/cachet/Cargo.toml b/crates/cachet/Cargo.toml
index 35819a7f8..058a620ae 100644
--- a/crates/cachet/Cargo.toml
+++ b/crates/cachet/Cargo.toml
@@ -4,7 +4,7 @@
[package]
name = "cachet"
description = "A composable, customizable multi-tier caching library with rich feature support."
-version = "0.1.0"
+version = "0.2.0"
readme = "README.md"
keywords = ["oxidizer", "caching", "concurrency"]
categories = ["caching", "concurrency"]
diff --git a/crates/cachet/README.md b/crates/cachet/README.md
index a28fff473..6184c7b4c 100644
--- a/crates/cachet/README.md
+++ b/crates/cachet/README.md
@@ -240,22 +240,22 @@ Event name: `cache.event` with fields `cache.name`, `cache.operation`,
This crate was developed as part of The Oxidizer Project. Browse this crate's source code.
- [__cargo_doc2readme_dependencies_info]: ggGkYW0CYXSEGy4k8ldDFPOhG2VNeXtD5nnKG6EPY6OfW5wBG8g18NOFNdxpYXKEGxoy2aS_r_WIG7xeYKGh3m5fG0GpQVALXxi6G6rN-ofywfKRYWSGgmZjYWNoZXRlMC4xLjCCbWNhY2hldF9tZW1vcnllMC4xLjCCbmNhY2hldF9zZXJ2aWNlZTAuMS4wgmtjYWNoZXRfdGllcmUwLjEuMIJkdGlja2UwLjIuMYJpdW5pZmxpZ2h0ZTAuMS4w
- [__link0]: https://docs.rs/cachet/0.1.0/cachet/?search=TimeToRefresh
+ [__cargo_doc2readme_dependencies_info]: ggGkYW0CYXSEGy4k8ldDFPOhG2VNeXtD5nnKG6EPY6OfW5wBG8g18NOFNdxpYXKEGxoy2aS_r_WIG7xeYKGh3m5fG0GpQVALXxi6G6rN-ofywfKRYWSGgmZjYWNoZXRlMC4yLjCCbWNhY2hldF9tZW1vcnllMC4yLjCCbmNhY2hldF9zZXJ2aWNlZTAuMi4wgmtjYWNoZXRfdGllcmUwLjIuMIJkdGlja2UwLjIuMYJpdW5pZmxpZ2h0ZTAuMS4w
+ [__link0]: https://docs.rs/cachet/0.2.0/cachet/?search=TimeToRefresh
[__link1]: https://crates.io/crates/uniflight/0.1.0
- [__link10]: https://docs.rs/cachet_tier/0.1.0/cachet_tier/?search=CacheTier
- [__link11]: https://docs.rs/cachet/0.1.0/cachet/?search=FallbackPromotionPolicy
- [__link12]: https://docs.rs/cachet/0.1.0/cachet/?search=TimeToRefresh
- [__link13]: https://docs.rs/cachet_tier/0.1.0/cachet_tier/?search=Error
- [__link14]: https://crates.io/crates/cachet_tier/0.1.0
- [__link15]: https://crates.io/crates/cachet_memory/0.1.0
+ [__link10]: https://docs.rs/cachet_tier/0.2.0/cachet_tier/?search=CacheTier
+ [__link11]: https://docs.rs/cachet/0.2.0/cachet/?search=FallbackPromotionPolicy
+ [__link12]: https://docs.rs/cachet/0.2.0/cachet/?search=TimeToRefresh
+ [__link13]: https://docs.rs/cachet_tier/0.2.0/cachet_tier/?search=Error
+ [__link14]: https://crates.io/crates/cachet_tier/0.2.0
+ [__link15]: https://crates.io/crates/cachet_memory/0.2.0
[__link16]: https://docs.rs/moka
- [__link17]: https://crates.io/crates/cachet_service/0.1.0
- [__link2]: https://docs.rs/cachet/0.1.0/cachet/?search=CacheBuilder::stampede_protection
- [__link3]: https://docs.rs/cachet_tier/0.1.0/cachet_tier/?search=CacheTier
- [__link4]: https://docs.rs/cachet_tier/0.1.0/cachet_tier/?search=DynamicCache
- [__link5]: https://docs.rs/cachet/0.1.0/cachet/?search=FallbackPromotionPolicy
+ [__link17]: https://crates.io/crates/cachet_service/0.2.0
+ [__link2]: https://docs.rs/cachet/0.2.0/cachet/?search=CacheBuilder::stampede_protection
+ [__link3]: https://docs.rs/cachet_tier/0.2.0/cachet_tier/?search=CacheTier
+ [__link4]: https://docs.rs/cachet_tier/0.2.0/cachet_tier/?search=DynamicCache
+ [__link5]: https://docs.rs/cachet/0.2.0/cachet/?search=FallbackPromotionPolicy
[__link6]: https://docs.rs/tick/0.2.1/tick/?search=Clock
- [__link7]: https://docs.rs/cachet/0.1.0/cachet/?search=Cache
- [__link8]: https://docs.rs/cachet/0.1.0/cachet/?search=CacheBuilder
- [__link9]: https://docs.rs/cachet_tier/0.1.0/cachet_tier/?search=CacheEntry
+ [__link7]: https://docs.rs/cachet/0.2.0/cachet/?search=Cache
+ [__link8]: https://docs.rs/cachet/0.2.0/cachet/?search=CacheBuilder
+ [__link9]: https://docs.rs/cachet_tier/0.2.0/cachet_tier/?search=CacheEntry
diff --git a/crates/cachet_memory/CHANGELOG.md b/crates/cachet_memory/CHANGELOG.md
index 2fcbf5dd9..bbbd18fce 100644
--- a/crates/cachet_memory/CHANGELOG.md
+++ b/crates/cachet_memory/CHANGELOG.md
@@ -1,5 +1,11 @@
# Changelog
+## [0.2.0] - 2026-04-20
+
+- ⚠️ Breaking
+
+ - bump `ohno` to 0.4.0 and `cachet_tier` to 0.2.0
+
## [0.1.0]
Initial release.
diff --git a/crates/cachet_memory/Cargo.toml b/crates/cachet_memory/Cargo.toml
index 084f97fbf..56aaff6dd 100644
--- a/crates/cachet_memory/Cargo.toml
+++ b/crates/cachet_memory/Cargo.toml
@@ -4,7 +4,7 @@
[package]
name = "cachet_memory"
description = "In-memory cache tier backed by Moka for the cachet caching library."
-version = "0.1.0"
+version = "0.2.0"
readme = "README.md"
keywords = ["oxidizer", "caching", "concurrency"]
categories = ["caching", "concurrency"]
diff --git a/crates/cachet_memory/README.md b/crates/cachet_memory/README.md
index 80909725a..730b90b1e 100644
--- a/crates/cachet_memory/README.md
+++ b/crates/cachet_memory/README.md
@@ -73,11 +73,11 @@ TTL/TTI unset or set them to a sufficiently high ceiling.
This crate was developed as part of The Oxidizer Project. Browse this crate's source code.
- [__cargo_doc2readme_dependencies_info]: ggGkYW0CYXSEGy4k8ldDFPOhG2VNeXtD5nnKG6EPY6OfW5wBG8g18NOFNdxpYXKEGx97UkpE8tyEG0w3jevrQF8SG5D28UVlbZVEG3A-UY200y_0YWSCgm1jYWNoZXRfbWVtb3J5ZTAuMS4wgmtjYWNoZXRfdGllcmUwLjEuMA
- [__link0]: https://docs.rs/cachet_memory/0.1.0/cachet_memory/?search=InMemoryCache
- [__link1]: https://docs.rs/cachet_memory/0.1.0/cachet_memory/?search=InMemoryCacheBuilder
- [__link2]: https://docs.rs/cachet_memory/0.1.0/cachet_memory/?search=policy::EvictionPolicy
- [__link3]: https://docs.rs/cachet_tier/0.1.0/cachet_tier/?search=CacheEntry::expires_after
- [__link4]: https://docs.rs/cachet_tier/0.1.0/cachet_tier/?search=CacheEntry::expires_after
- [__link5]: https://docs.rs/cachet_memory/0.1.0/cachet_memory/?search=InMemoryCacheBuilder::time_to_live
- [__link6]: https://docs.rs/cachet_memory/0.1.0/cachet_memory/?search=InMemoryCacheBuilder::time_to_idle
+ [__cargo_doc2readme_dependencies_info]: ggGkYW0CYXSEGy4k8ldDFPOhG2VNeXtD5nnKG6EPY6OfW5wBG8g18NOFNdxpYXKEGx97UkpE8tyEG0w3jevrQF8SG5D28UVlbZVEG3A-UY200y_0YWSCgm1jYWNoZXRfbWVtb3J5ZTAuMi4wgmtjYWNoZXRfdGllcmUwLjIuMA
+ [__link0]: https://docs.rs/cachet_memory/0.2.0/cachet_memory/?search=InMemoryCache
+ [__link1]: https://docs.rs/cachet_memory/0.2.0/cachet_memory/?search=InMemoryCacheBuilder
+ [__link2]: https://docs.rs/cachet_memory/0.2.0/cachet_memory/?search=policy::EvictionPolicy
+ [__link3]: https://docs.rs/cachet_tier/0.2.0/cachet_tier/?search=CacheEntry::expires_after
+ [__link4]: https://docs.rs/cachet_tier/0.2.0/cachet_tier/?search=CacheEntry::expires_after
+ [__link5]: https://docs.rs/cachet_memory/0.2.0/cachet_memory/?search=InMemoryCacheBuilder::time_to_live
+ [__link6]: https://docs.rs/cachet_memory/0.2.0/cachet_memory/?search=InMemoryCacheBuilder::time_to_idle
diff --git a/crates/cachet_service/CHANGELOG.md b/crates/cachet_service/CHANGELOG.md
index 2fcbf5dd9..f2232aecc 100644
--- a/crates/cachet_service/CHANGELOG.md
+++ b/crates/cachet_service/CHANGELOG.md
@@ -1,5 +1,11 @@
# Changelog
+## [0.2.0] - 2026-04-20
+
+- ⚠️ Breaking
+
+ - bump `cachet_tier` to 0.2.0
+
## [0.1.0]
Initial release.
diff --git a/crates/cachet_service/Cargo.toml b/crates/cachet_service/Cargo.toml
index efad944ba..8e099b2cb 100644
--- a/crates/cachet_service/Cargo.toml
+++ b/crates/cachet_service/Cargo.toml
@@ -4,7 +4,7 @@
[package]
name = "cachet_service"
description = "Layered service integration for the cachet caching library."
-version = "0.1.0"
+version = "0.2.0"
readme = "README.md"
keywords = ["oxidizer", "caching", "concurrency"]
categories = ["caching", "concurrency"]
diff --git a/crates/cachet_service/README.md b/crates/cachet_service/README.md
index 36412f5d9..415b33e1d 100644
--- a/crates/cachet_service/README.md
+++ b/crates/cachet_service/README.md
@@ -45,7 +45,7 @@ let tier = ServiceAdapter::new(my_service);
This crate was developed as part of The Oxidizer Project. Browse this crate's source code.
- [__cargo_doc2readme_dependencies_info]: ggGkYW0CYXSEGy4k8ldDFPOhG2VNeXtD5nnKG6EPY6OfW5wBG8g18NOFNdxpYXKEG3K5S_LB5wBuG9aH2I-oE91BG6p757n6ShIyG2QJsgO5MU4kYWSCgm5jYWNoZXRfc2VydmljZWUwLjEuMIJrY2FjaGV0X3RpZXJlMC4xLjA
- [__link0]: https://docs.rs/cachet_service/0.1.0/cachet_service/?search=ServiceAdapter
- [__link1]: https://docs.rs/cachet_tier/0.1.0/cachet_tier/?search=CacheTier
- [__link2]: https://docs.rs/cachet_service/0.1.0/cachet_service/?search=ServiceAdapter
+ [__cargo_doc2readme_dependencies_info]: ggGkYW0CYXSEGy4k8ldDFPOhG2VNeXtD5nnKG6EPY6OfW5wBG8g18NOFNdxpYXKEG3K5S_LB5wBuG9aH2I-oE91BG6p757n6ShIyG2QJsgO5MU4kYWSCgm5jYWNoZXRfc2VydmljZWUwLjIuMIJrY2FjaGV0X3RpZXJlMC4yLjA
+ [__link0]: https://docs.rs/cachet_service/0.2.0/cachet_service/?search=ServiceAdapter
+ [__link1]: https://docs.rs/cachet_tier/0.2.0/cachet_tier/?search=CacheTier
+ [__link2]: https://docs.rs/cachet_service/0.2.0/cachet_service/?search=ServiceAdapter
diff --git a/crates/cachet_tier/CHANGELOG.md b/crates/cachet_tier/CHANGELOG.md
index 2fcbf5dd9..9a042d5e8 100644
--- a/crates/cachet_tier/CHANGELOG.md
+++ b/crates/cachet_tier/CHANGELOG.md
@@ -1,5 +1,11 @@
# Changelog
+## [0.2.0] - 2026-04-20
+
+- ⚠️ Breaking
+
+ - bump `ohno` to 0.4.0
+
## [0.1.0]
Initial release.
diff --git a/crates/cachet_tier/Cargo.toml b/crates/cachet_tier/Cargo.toml
index 0923a5f06..76979ffd0 100644
--- a/crates/cachet_tier/Cargo.toml
+++ b/crates/cachet_tier/Cargo.toml
@@ -4,7 +4,7 @@
[package]
name = "cachet_tier"
description = "Core cache tier trait and abstractions for building cache backends."
-version = "0.1.0"
+version = "0.2.0"
readme = "README.md"
keywords = ["oxidizer", "caching", "concurrency"]
categories = ["caching", "concurrency"]
diff --git a/crates/cachet_tier/README.md b/crates/cachet_tier/README.md
index 92a8caa71..c89da5d58 100644
--- a/crates/cachet_tier/README.md
+++ b/crates/cachet_tier/README.md
@@ -74,10 +74,10 @@ for multi-tier caches with heterogeneous storage backends.
This crate was developed as part of The Oxidizer Project. Browse this crate's source code.
- [__cargo_doc2readme_dependencies_info]: ggGkYW0CYXSEGy4k8ldDFPOhG2VNeXtD5nnKG6EPY6OfW5wBG8g18NOFNdxpYXKEG0hRqDfWg1oDG5BT1ZI-3omTG5WE4GB0Mg57G-G4ebzGeSk5YWSBgmtjYWNoZXRfdGllcmUwLjEuMA
- [__link0]: https://docs.rs/cachet_tier/0.1.0/cachet_tier/?search=CacheTier
- [__link1]: https://docs.rs/cachet_tier/0.1.0/cachet_tier/?search=CacheEntry
- [__link2]: https://docs.rs/cachet_tier/0.1.0/cachet_tier/?search=Error
- [__link3]: https://docs.rs/cachet_tier/0.1.0/cachet_tier/?search=CacheTier
- [__link4]: https://docs.rs/cachet_tier/0.1.0/cachet_tier/?search=CacheTier
- [__link5]: https://docs.rs/cachet_tier/0.1.0/cachet_tier/?search=DynamicCache
+ [__cargo_doc2readme_dependencies_info]: ggGkYW0CYXSEGy4k8ldDFPOhG2VNeXtD5nnKG6EPY6OfW5wBG8g18NOFNdxpYXKEG0hRqDfWg1oDG5BT1ZI-3omTG5WE4GB0Mg57G-G4ebzGeSk5YWSBgmtjYWNoZXRfdGllcmUwLjIuMA
+ [__link0]: https://docs.rs/cachet_tier/0.2.0/cachet_tier/?search=CacheTier
+ [__link1]: https://docs.rs/cachet_tier/0.2.0/cachet_tier/?search=CacheEntry
+ [__link2]: https://docs.rs/cachet_tier/0.2.0/cachet_tier/?search=Error
+ [__link3]: https://docs.rs/cachet_tier/0.2.0/cachet_tier/?search=CacheTier
+ [__link4]: https://docs.rs/cachet_tier/0.2.0/cachet_tier/?search=CacheTier
+ [__link5]: https://docs.rs/cachet_tier/0.2.0/cachet_tier/?search=DynamicCache
diff --git a/crates/http_extensions/CHANGELOG.md b/crates/http_extensions/CHANGELOG.md
index 307273813..f02161e49 100644
--- a/crates/http_extensions/CHANGELOG.md
+++ b/crates/http_extensions/CHANGELOG.md
@@ -1,5 +1,11 @@
# Changelog
+## [0.4.0] - 2026-04-20
+
+- ⚠️ Breaking
+
+ - `Labeled::label()` now returns `ErrorLabel` by value instead of `&ErrorLabel` (via `ohno` 0.4.0)
+
## [0.3.1] - 2026-04-20
- ✨ Features
diff --git a/crates/http_extensions/Cargo.toml b/crates/http_extensions/Cargo.toml
index d217e0698..9efbf741f 100644
--- a/crates/http_extensions/Cargo.toml
+++ b/crates/http_extensions/Cargo.toml
@@ -4,7 +4,7 @@
[package]
name = "http_extensions"
description = "Shared HTTP types and extension traits for clients and servers."
-version = "0.3.1"
+version = "0.4.0"
readme = "README.md"
keywords = ["oxidizer", "http", "extensions", "client", "server"]
categories = ["network-programming"]
diff --git a/crates/http_extensions/README.md b/crates/http_extensions/README.md
index a0836c957..d1c17509e 100644
--- a/crates/http_extensions/README.md
+++ b/crates/http_extensions/README.md
@@ -170,23 +170,23 @@ for future requests. This makes the crate particularly efficient for high-throug
This crate was developed as part of The Oxidizer Project. Browse this crate's source code.
- [__cargo_doc2readme_dependencies_info]: ggGkYW0CYXSEGy4k8ldDFPOhG2VNeXtD5nnKG6EPY6OfW5wBG8g18NOFNdxpYXKEG7dZHfOzXCO1G4yXrVZokY8aGy09bmHyxlgGG3QVOINBIZOaYWSFgmVieXRlc2YxLjExLjGCaGJ5dGVzYnVmZTAuNC4ygmRodHRwZTEuNC4wgmlodHRwX2JvZHllMS4wLjGCb2h0dHBfZXh0ZW5zaW9uc2UwLjMuMQ
+ [__cargo_doc2readme_dependencies_info]: ggGkYW0CYXSEGy4k8ldDFPOhG2VNeXtD5nnKG6EPY6OfW5wBG8g18NOFNdxpYXKEG7dZHfOzXCO1G4yXrVZokY8aGy09bmHyxlgGG3QVOINBIZOaYWSFgmVieXRlc2YxLjExLjGCaGJ5dGVzYnVmZTAuNC4ygmRodHRwZTEuNC4wgmlodHRwX2JvZHllMS4wLjGCb2h0dHBfZXh0ZW5zaW9uc2UwLjQuMA
[__link0]: https://crates.io/crates/http/1.4.0
- [__link1]: https://docs.rs/http_extensions/0.3.1/http_extensions/type.HttpRequest.html
- [__link10]: https://docs.rs/http_extensions/0.3.1/http_extensions/?search=StatusExt
- [__link11]: https://docs.rs/http_extensions/0.3.1/http_extensions/?search=RequestExt
- [__link12]: https://docs.rs/http_extensions/0.3.1/http_extensions/?search=ResponseExt
- [__link13]: https://docs.rs/http_extensions/0.3.1/http_extensions/?search=HttpRequestExt
- [__link14]: https://docs.rs/http_extensions/0.3.1/http_extensions/?search=HeaderMapExt
- [__link15]: https://docs.rs/http_extensions/0.3.1/http_extensions/?search=HeaderValueExt
+ [__link1]: https://docs.rs/http_extensions/0.4.0/http_extensions/type.HttpRequest.html
+ [__link10]: https://docs.rs/http_extensions/0.4.0/http_extensions/?search=StatusExt
+ [__link11]: https://docs.rs/http_extensions/0.4.0/http_extensions/?search=RequestExt
+ [__link12]: https://docs.rs/http_extensions/0.4.0/http_extensions/?search=ResponseExt
+ [__link13]: https://docs.rs/http_extensions/0.4.0/http_extensions/?search=HttpRequestExt
+ [__link14]: https://docs.rs/http_extensions/0.4.0/http_extensions/?search=HeaderMapExt
+ [__link15]: https://docs.rs/http_extensions/0.4.0/http_extensions/?search=HeaderValueExt
[__link16]: https://docs.rs/http/1.4.0/http/?search=HeaderValue
[__link17]: https://docs.rs/bytes/1.11.1/bytes/?search=Bytes
- [__link18]: https://docs.rs/http_extensions/0.3.1/http_extensions/?search=ExtensionsExt
+ [__link18]: https://docs.rs/http_extensions/0.4.0/http_extensions/?search=ExtensionsExt
[__link19]: https://docs.rs/http/1.4.0/http/?search=Extensions
- [__link2]: https://docs.rs/http_extensions/0.3.1/http_extensions/type.HttpResponse.html
- [__link20]: https://docs.rs/http_extensions/0.3.1/http_extensions/?search=RequestHandler
- [__link21]: https://docs.rs/http_extensions/0.3.1/http_extensions/?search=HttpRequestBuilder
- [__link22]: https://docs.rs/http_extensions/0.3.1/http_extensions/?search=StatusExt::ensure_success
+ [__link2]: https://docs.rs/http_extensions/0.4.0/http_extensions/type.HttpResponse.html
+ [__link20]: https://docs.rs/http_extensions/0.4.0/http_extensions/?search=RequestHandler
+ [__link21]: https://docs.rs/http_extensions/0.4.0/http_extensions/?search=HttpRequestBuilder
+ [__link22]: https://docs.rs/http_extensions/0.4.0/http_extensions/?search=StatusExt::ensure_success
[__link23]: https://crates.io/crates/http/1.4.0
[__link24]: https://docs.rs/http/1.4.0/http/?search=Request
[__link25]: https://docs.rs/http/1.4.0/http/?search=Response
@@ -194,12 +194,12 @@ This crate was developed as part of The Oxidizer Project. Br
[__link27]: https://docs.rs/http/1.4.0/http/?search=StatusCode
[__link28]: https://docs.rs/http/1.4.0/http/?search=HeaderMap
[__link29]: https://docs.rs/http_body/1.0.1/http_body/?search=Body
- [__link3]: https://docs.rs/http_extensions/0.3.1/http_extensions/?search=HttpBody
- [__link30]: https://docs.rs/http_extensions/0.3.1/http_extensions/?search=HttpBodyBuilder
+ [__link3]: https://docs.rs/http_extensions/0.4.0/http_extensions/?search=HttpBody
+ [__link30]: https://docs.rs/http_extensions/0.4.0/http_extensions/?search=HttpBodyBuilder
[__link31]: https://crates.io/crates/bytesbuf/0.4.2
- [__link4]: https://docs.rs/http_extensions/0.3.1/http_extensions/?search=HttpRequestBuilder
- [__link5]: https://docs.rs/http_extensions/0.3.1/http_extensions/?search=HttpResponseBuilder
- [__link6]: https://docs.rs/http_extensions/0.3.1/http_extensions/?search=HttpBody
- [__link7]: https://docs.rs/http_extensions/0.3.1/http_extensions/?search=HttpBodyBuilder
- [__link8]: https://docs.rs/http_extensions/0.3.1/http_extensions/?search=HttpError
- [__link9]: https://docs.rs/http_extensions/0.3.1/http_extensions/?search=RequestHandler
+ [__link4]: https://docs.rs/http_extensions/0.4.0/http_extensions/?search=HttpRequestBuilder
+ [__link5]: https://docs.rs/http_extensions/0.4.0/http_extensions/?search=HttpResponseBuilder
+ [__link6]: https://docs.rs/http_extensions/0.4.0/http_extensions/?search=HttpBody
+ [__link7]: https://docs.rs/http_extensions/0.4.0/http_extensions/?search=HttpBodyBuilder
+ [__link8]: https://docs.rs/http_extensions/0.4.0/http_extensions/?search=HttpError
+ [__link9]: https://docs.rs/http_extensions/0.4.0/http_extensions/?search=RequestHandler
diff --git a/crates/http_extensions/src/error.rs b/crates/http_extensions/src/error.rs
index 0b6ff5e82..e9fef1fb9 100644
--- a/crates/http_extensions/src/error.rs
+++ b/crates/http_extensions/src/error.rs
@@ -113,7 +113,7 @@ pub type Result = std::result::Result;
InvalidStatusCode(label: LABEL_STATUS_CODE_INVALID, recovery: RecoveryInfo::never()),
MaxSizeReached(label: LABEL_BODY_SIZE_LIMIT_REACHED, recovery: RecoveryInfo::never()),
std::io::Error(label: LABEL_IO, recovery: RecoveryInfo::from(error.kind())),
- templated_uri::ValidationError(label: error.label().clone(), recovery: RecoveryInfo::never())
+ templated_uri::ValidationError(label: error.label(), recovery: RecoveryInfo::never())
)]
pub struct HttpError {
label: ErrorLabel,
@@ -267,11 +267,11 @@ impl HttpError {
#[cfg(test)]
pub(crate) fn resolve_error_label(error: &(dyn std::error::Error + 'static)) -> Option {
if let Some(err) = error.downcast_ref::() {
- return Some(err.label().clone());
+ return Some(err.label());
}
if let Some(err) = error.downcast_ref::() {
- return Some(err.label().clone());
+ return Some(err.label());
}
if let Some(err) = error.downcast_ref::() {
@@ -289,8 +289,8 @@ impl Recovery for HttpError {
}
impl Labeled for HttpError {
- fn label(&self) -> &ErrorLabel {
- &self.label
+ fn label(&self) -> ErrorLabel {
+ self.label.clone()
}
}
diff --git a/crates/http_extensions/src/json.rs b/crates/http_extensions/src/json.rs
index 5ee8cc582..d78b9c9ba 100644
--- a/crates/http_extensions/src/json.rs
+++ b/crates/http_extensions/src/json.rs
@@ -53,8 +53,8 @@ impl JsonError {
}
impl Labeled for JsonError {
- fn label(&self) -> &ErrorLabel {
- &self.label
+ fn label(&self) -> ErrorLabel {
+ self.label.clone()
}
}
diff --git a/crates/ohno/CHANGELOG.md b/crates/ohno/CHANGELOG.md
index 2ae2e8514..8f6d7f6aa 100644
--- a/crates/ohno/CHANGELOG.md
+++ b/crates/ohno/CHANGELOG.md
@@ -1,5 +1,11 @@
# Changelog
+## [0.4.0] - 2026-04-20
+
+- ⚠️ Breaking
+
+ - `Labeled::label()` now returns `ErrorLabel` by value instead of `&ErrorLabel`
+
## [0.3.2] - 2026-04-15
- ✨ Features
diff --git a/crates/ohno/Cargo.toml b/crates/ohno/Cargo.toml
index 4f19af84a..67439b6c2 100644
--- a/crates/ohno/Cargo.toml
+++ b/crates/ohno/Cargo.toml
@@ -4,7 +4,7 @@
[package]
name = "ohno"
description = "High-quality Rust error handling."
-version = "0.3.2"
+version = "0.4.0"
readme = "README.md"
keywords = ["oxidizer", "error", "backtrace"]
categories = ["data-structures"]
diff --git a/crates/ohno/README.md b/crates/ohno/README.md
index 6da7ba709..fb206847a 100644
--- a/crates/ohno/README.md
+++ b/crates/ohno/README.md
@@ -292,25 +292,25 @@ uniformly via [`Labeled::label`][__link21].
This crate was developed as part of The Oxidizer Project. Browse this crate's source code.
- [__cargo_doc2readme_dependencies_info]: ggGkYW0CYXSEGy4k8ldDFPOhG2VNeXtD5nnKG6EPY6OfW5wBG8g18NOFNdxpYXKEG6wnfcY2uiFGG0Xrr3B-7vuMGx9RE6mpuHhQGxPVenE9RhyaYWSCgmRvaG5vZTAuMy4ygmtvaG5vX21hY3Jvc2UwLjMuMA
+ [__cargo_doc2readme_dependencies_info]: ggGkYW0CYXSEGy4k8ldDFPOhG2VNeXtD5nnKG6EPY6OfW5wBG8g18NOFNdxpYXKEG6wnfcY2uiFGG0Xrr3B-7vuMGx9RE6mpuHhQGxPVenE9RhyaYWSCgmRvaG5vZTAuNC4wgmtvaG5vX21hY3Jvc2UwLjMuMA
[__link0]: https://doc.rust-lang.org/stable/std/?search=fmt::Display
[__link1]: https://doc.rust-lang.org/stable/std/?search=fmt::Debug
[__link10]: https://doc.rust-lang.org/stable/std/macro.unreachable.html
[__link11]: https://docs.rs/ohno_macros/0.3.0/ohno_macros/?search=enrich_err
[__link12]: https://docs.rs/ohno_macros/0.3.0/ohno_macros/?search=enrich_err
- [__link13]: https://docs.rs/ohno/0.3.2/ohno/?search=Enrichable
- [__link14]: https://docs.rs/ohno/0.3.2/ohno/?search=AppError
- [__link15]: https://docs.rs/ohno/0.3.2/ohno/?search=AppError
- [__link16]: https://docs.rs/ohno/0.3.2/ohno/?search=ErrorLabel
- [__link17]: https://docs.rs/ohno/0.3.2/ohno/?search=ErrorLabel::from_error_chain
+ [__link13]: https://docs.rs/ohno/0.4.0/ohno/?search=Enrichable
+ [__link14]: https://docs.rs/ohno/0.4.0/ohno/?search=AppError
+ [__link15]: https://docs.rs/ohno/0.4.0/ohno/?search=AppError
+ [__link16]: https://docs.rs/ohno/0.4.0/ohno/?search=ErrorLabel
+ [__link17]: https://docs.rs/ohno/0.4.0/ohno/?search=ErrorLabel::from_error_chain
[__link18]: https://doc.rust-lang.org/stable/std/?search=error::Error::source
- [__link19]: https://docs.rs/ohno/0.3.2/ohno/?search=ErrorLabel
- [__link2]: https://docs.rs/ohno/0.3.2/ohno/?search=ErrorExt
- [__link20]: https://docs.rs/ohno/0.3.2/ohno/?search=Labeled
- [__link21]: https://docs.rs/ohno/0.3.2/ohno/?search=Labeled::label
- [__link3]: https://docs.rs/ohno/0.3.2/ohno/?search=OhnoCore
- [__link4]: https://docs.rs/ohno/0.3.2/ohno/?search=AppError
- [__link5]: https://docs.rs/ohno/0.3.2/ohno/?search=OhnoCore
+ [__link19]: https://docs.rs/ohno/0.4.0/ohno/?search=ErrorLabel
+ [__link2]: https://docs.rs/ohno/0.4.0/ohno/?search=ErrorExt
+ [__link20]: https://docs.rs/ohno/0.4.0/ohno/?search=Labeled
+ [__link21]: https://docs.rs/ohno/0.4.0/ohno/?search=Labeled::label
+ [__link3]: https://docs.rs/ohno/0.4.0/ohno/?search=OhnoCore
+ [__link4]: https://docs.rs/ohno/0.4.0/ohno/?search=AppError
+ [__link5]: https://docs.rs/ohno/0.4.0/ohno/?search=OhnoCore
[__link6]: https://doc.rust-lang.org/stable/std/?search=error::Error
[__link7]: https://doc.rust-lang.org/stable/std/?search=fmt::Display
[__link8]: https://doc.rust-lang.org/stable/std/?search=fmt::Debug
diff --git a/crates/ohno/examples/label.rs b/crates/ohno/examples/label.rs
index 48b0eef18..fa0a14cf9 100644
--- a/crates/ohno/examples/label.rs
+++ b/crates/ohno/examples/label.rs
@@ -17,8 +17,8 @@ impl ApiError {
}
impl Labeled for ApiError {
- fn label(&self) -> &ErrorLabel {
- &self.label
+ fn label(&self) -> ErrorLabel {
+ self.label.clone()
}
}
@@ -36,7 +36,7 @@ fn report(error: &ApiError) {
}
if let Some(e) = e.downcast_ref::() {
- return Some(e.label().clone());
+ return Some(e.label());
}
None
diff --git a/crates/ohno/src/error_label.rs b/crates/ohno/src/error_label.rs
index 5d238741e..2e3225d0a 100644
--- a/crates/ohno/src/error_label.rs
+++ b/crates/ohno/src/error_label.rs
@@ -10,7 +10,7 @@ use std::iter::successors;
/// Trait for errors that carry an [`ErrorLabel`].
pub trait Labeled {
/// Returns the label attached to this error.
- fn label(&self) -> &ErrorLabel;
+ fn label(&self) -> ErrorLabel;
}
/// A low-cardinality label for an error, useful for metrics and logging.
diff --git a/crates/templated_uri/CHANGELOG.md b/crates/templated_uri/CHANGELOG.md
index 276e24947..6794ae5f1 100644
--- a/crates/templated_uri/CHANGELOG.md
+++ b/crates/templated_uri/CHANGELOG.md
@@ -1,4 +1,10 @@
# Changelog
+## [0.2.0] - 2026-04-20
+
+- ⚠️ Breaking
+
+ - `Labeled::label()` now returns `ErrorLabel` by value instead of `&ErrorLabel` (via `ohno` 0.4.0)
+
## [0.1.2] - 2026-04-16
- ✨ Features
diff --git a/crates/templated_uri/Cargo.toml b/crates/templated_uri/Cargo.toml
index dfd9a2e2a..e02e47c2a 100644
--- a/crates/templated_uri/Cargo.toml
+++ b/crates/templated_uri/Cargo.toml
@@ -4,7 +4,7 @@
[package]
name = "templated_uri"
description = "Standards-compliant URI handling with templating, safety validation, and data classification"
-version = "0.1.2"
+version = "0.2.0"
readme = "README.md"
keywords = ["oxidizer", "url", "parsing", "templates", "uri"]
categories = ["encoding", "parser-implementations", "template-engine", "web-programming"]
diff --git a/crates/templated_uri/README.md b/crates/templated_uri/README.md
index d569daf18..9458cbbf2 100644
--- a/crates/templated_uri/README.md
+++ b/crates/templated_uri/README.md
@@ -168,19 +168,19 @@ and servers based on [`hyper`][__link13] like [`reqwest`][__link14].
This crate was developed as part of The Oxidizer Project. Browse this crate's source code.
- [__cargo_doc2readme_dependencies_info]: ggGkYW0CYXSEGy4k8ldDFPOhG2VNeXtD5nnKG6EPY6OfW5wBG8g18NOFNdxpYXKEGyftk28CR_jhG9_WxkUHtfBdG9giB010pVAzGwCsTyFCPqO3YWSCgmRodHRwZTEuNC4wgm10ZW1wbGF0ZWRfdXJpZTAuMS4y
- [__link0]: https://docs.rs/templated_uri/0.1.2/templated_uri/?search=uri::Uri
- [__link1]: https://docs.rs/templated_uri/0.1.2/templated_uri/?search=BaseUri
+ [__cargo_doc2readme_dependencies_info]: ggGkYW0CYXSEGy4k8ldDFPOhG2VNeXtD5nnKG6EPY6OfW5wBG8g18NOFNdxpYXKEGyftk28CR_jhG9_WxkUHtfBdG9giB010pVAzGwCsTyFCPqO3YWSCgmRodHRwZTEuNC4wgm10ZW1wbGF0ZWRfdXJpZTAuMi4w
+ [__link0]: https://docs.rs/templated_uri/0.2.0/templated_uri/?search=uri::Uri
+ [__link1]: https://docs.rs/templated_uri/0.2.0/templated_uri/?search=BaseUri
[__link10]: https://docs.rs/http/latest/http/
- [__link11]: https://docs.rs/templated_uri/0.1.2/templated_uri/?search=uri::Uri
+ [__link11]: https://docs.rs/templated_uri/0.2.0/templated_uri/?search=uri::Uri
[__link12]: https://docs.rs/http/1.4.0/http/?search=Uri
[__link13]: https://docs.rs/hyper/latest/hyper/
[__link14]: https://docs.rs/reqwest/latest/reqwest/
- [__link2]: https://docs.rs/templated_uri/0.1.2/templated_uri/?search=BasePath
- [__link3]: https://docs.rs/templated_uri/0.1.2/templated_uri/?search=TemplatedPathAndQuery
- [__link4]: https://docs.rs/templated_uri/0.1.2/templated_uri/?search=UriSafe
- [__link5]: https://docs.rs/templated_uri/0.1.2/templated_uri/?search=UriSafeString
- [__link6]: https://docs.rs/templated_uri/0.1.2/templated_uri/?search=UriSafe
- [__link7]: https://docs.rs/templated_uri/0.1.2/templated_uri/?search=UriSafeString
+ [__link2]: https://docs.rs/templated_uri/0.2.0/templated_uri/?search=BasePath
+ [__link3]: https://docs.rs/templated_uri/0.2.0/templated_uri/?search=TemplatedPathAndQuery
+ [__link4]: https://docs.rs/templated_uri/0.2.0/templated_uri/?search=UriSafe
+ [__link5]: https://docs.rs/templated_uri/0.2.0/templated_uri/?search=UriSafeString
+ [__link6]: https://docs.rs/templated_uri/0.2.0/templated_uri/?search=UriSafe
+ [__link7]: https://docs.rs/templated_uri/0.2.0/templated_uri/?search=UriSafeString
[__link8]: https://datatracker.ietf.org/doc/html/rfc6570
- [__link9]: https://docs.rs/templated_uri/0.1.2/templated_uri/?search=UriParam
+ [__link9]: https://docs.rs/templated_uri/0.2.0/templated_uri/?search=UriParam
diff --git a/crates/templated_uri/src/error.rs b/crates/templated_uri/src/error.rs
index 0842e4109..98fce9605 100644
--- a/crates/templated_uri/src/error.rs
+++ b/crates/templated_uri/src/error.rs
@@ -30,8 +30,8 @@ impl ValidationError {
}
impl Labeled for ValidationError {
- fn label(&self) -> &ErrorLabel {
- &self.label
+ fn label(&self) -> ErrorLabel {
+ self.label.clone()
}
}