diff --git a/ssz/Cargo.toml b/ssz/Cargo.toml index 38a691b..12ad059 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.2", 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};