diff --git a/Cargo.toml b/Cargo.toml index 48df52d..e2eaacf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,6 +10,11 @@ documentation = "https://docs.rs/ssz_types" keywords = ["ethereum"] categories = ["cryptography::cryptocurrencies"] +[features] +default = ["ring"] +ring = ["tree_hash/ring"] +context_deserialize = ["dep:context_deserialize"] + [dependencies] tree_hash = { version = "0.11.0", default-features = false } ethereum_serde_utils = "0.8.0" @@ -20,16 +25,13 @@ typenum = "1.12.0" smallvec = "1.8.0" arbitrary = { version = "1.0", features = ["derive"], optional = true } itertools = "0.14.0" +context_deserialize = { version = "0.2", optional = true } [dev-dependencies] criterion = "0.7.0" serde_json = "1.0.0" tree_hash_derive = "0.11.0" -[features] -default = ["ring"] -ring = ["tree_hash/ring"] - [[bench]] harness = false name = "encode_decode" diff --git a/src/context_deserialize.rs b/src/context_deserialize.rs new file mode 100644 index 0000000..50fd9b7 --- /dev/null +++ b/src/context_deserialize.rs @@ -0,0 +1,18 @@ +use crate::{typenum::Unsigned, FixedVector}; +use context_deserialize::ContextDeserialize; +use serde::de::{Deserializer, Error}; + +impl<'de, C, T, N> ContextDeserialize<'de, C> for FixedVector +where + T: ContextDeserialize<'de, C>, + N: Unsigned, + C: Clone, +{ + fn context_deserialize(deserializer: D, context: C) -> Result + where + D: Deserializer<'de>, + { + let vec = Vec::::context_deserialize(deserializer, context)?; + FixedVector::new(vec).map_err(|e| D::Error::custom(format!("{:?}", e))) + } +} diff --git a/src/lib.rs b/src/lib.rs index 394de53..a0044c4 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -43,6 +43,9 @@ pub mod serde_utils; mod tree_hash; mod variable_list; +#[cfg(feature = "context_deserialize")] +mod context_deserialize; + pub use fixed_vector::FixedVector; pub use ssz::{BitList, BitVector, Bitfield}; pub use typenum;