From 5b869b4d740eaae4a3251d082587ed0fd40fdd9b Mon Sep 17 00:00:00 2001 From: Mac L Date: Tue, 28 Oct 2025 23:10:19 +1100 Subject: [PATCH 1/2] Add context_deserialize impl --- ssz/Cargo.toml | 14 ++++++++------ ssz/src/context_deserialize.rs | 33 +++++++++++++++++++++++++++++++++ ssz/src/lib.rs | 3 +++ 3 files changed, 44 insertions(+), 6 deletions(-) create mode 100644 ssz/src/context_deserialize.rs diff --git a/ssz/Cargo.toml b/ssz/Cargo.toml index 38a691b..ab0a338 100644 --- a/ssz/Cargo.toml +++ b/ssz/Cargo.toml @@ -13,10 +13,9 @@ categories = ["cryptography::cryptocurrencies"] [lib] name = "ssz" -[dev-dependencies] -alloy-primitives = { version = "1.0", features = ["getrandom"] } -ethereum_ssz_derive = { version = "0.9.0", path = "../ssz_derive" } -serde_json = "1.0.0" +[features] +arbitrary = ["dep:arbitrary", "alloy-primitives/arbitrary"] +context_deserialize = ["dep:context_deserialize"] [dependencies] alloy-primitives = "1.0" @@ -27,6 +26,9 @@ serde = "1.0.0" serde_derive = "1.0.0" typenum = "1.12.0" arbitrary = { version = "1.0", features = ["derive"], optional = true } +context_deserialize = { version = "0.1", optional = true } -[features] -arbitrary = ["dep:arbitrary", "alloy-primitives/arbitrary"] +[dev-dependencies] +alloy-primitives = { version = "1.0", features = ["getrandom"] } +ethereum_ssz_derive = { version = "0.9.0", path = "../ssz_derive" } +serde_json = "1.0.0" diff --git a/ssz/src/context_deserialize.rs b/ssz/src/context_deserialize.rs new file mode 100644 index 0000000..0bc57f7 --- /dev/null +++ b/ssz/src/context_deserialize.rs @@ -0,0 +1,33 @@ +use crate::{Bitfield, Fixed, Variable}; +use context_deserialize::ContextDeserialize; +use serde::{ + de::{Deserializer, Error}, + Deserialize, +}; +use typenum::Unsigned; + +impl<'de, C, N> ContextDeserialize<'de, C> for Bitfield> +where + N: Unsigned + Clone, +{ + fn context_deserialize(deserializer: D, _context: C) -> Result + where + D: Deserializer<'de>, + { + Bitfield::>::deserialize(deserializer) + .map_err(|e| D::Error::custom(format!("{:?}", e))) + } +} + +impl<'de, C, N> ContextDeserialize<'de, C> for Bitfield> +where + N: Unsigned + Clone, +{ + fn context_deserialize(deserializer: D, _context: C) -> Result + where + D: Deserializer<'de>, + { + Bitfield::>::deserialize(deserializer) + .map_err(|e| D::Error::custom(format!("{:?}", e))) + } +} diff --git a/ssz/src/lib.rs b/ssz/src/lib.rs index edfed0d..a5eaa26 100644 --- a/ssz/src/lib.rs +++ b/ssz/src/lib.rs @@ -40,6 +40,9 @@ mod encode; pub mod legacy; mod union_selector; +#[cfg(feature = "context_deserialize")] +mod context_deserialize; + pub use bitfield::bitvector_dynamic::{BitVectorDynamic, Dynamic}; #[doc(hidden)] pub use bitfield::{BitList, BitVector, Bitfield, Error as BitfieldError, Fixed, Variable}; From 16e9103ef9d2e8bf786dbc9278934b62eb340ff4 Mon Sep 17 00:00:00 2001 From: Mac L Date: Fri, 7 Nov 2025 22:41:41 +1100 Subject: [PATCH 2/2] Use new `context_deserialize` version --- ssz/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ssz/Cargo.toml b/ssz/Cargo.toml index ab0a338..12ad059 100644 --- a/ssz/Cargo.toml +++ b/ssz/Cargo.toml @@ -26,7 +26,7 @@ serde = "1.0.0" serde_derive = "1.0.0" typenum = "1.12.0" arbitrary = { version = "1.0", features = ["derive"], optional = true } -context_deserialize = { version = "0.1", optional = true } +context_deserialize = { version = "0.2", optional = true } [dev-dependencies] alloy-primitives = { version = "1.0", features = ["getrandom"] }