Skip to content

Commit a548764

Browse files
authored
Add context_deserialize impl (#61)
* Add context_deserialize impl * Use new `context_deserialize` version
1 parent d3741d3 commit a548764

File tree

3 files changed

+44
-6
lines changed

3 files changed

+44
-6
lines changed

ssz/Cargo.toml

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,9 @@ categories = ["cryptography::cryptocurrencies"]
1313
[lib]
1414
name = "ssz"
1515

16-
[dev-dependencies]
17-
alloy-primitives = { version = "1.0", features = ["getrandom"] }
18-
ethereum_ssz_derive = { version = "0.9.0", path = "../ssz_derive" }
19-
serde_json = "1.0.0"
16+
[features]
17+
arbitrary = ["dep:arbitrary", "alloy-primitives/arbitrary"]
18+
context_deserialize = ["dep:context_deserialize"]
2019

2120
[dependencies]
2221
alloy-primitives = "1.0"
@@ -27,6 +26,9 @@ serde = "1.0.0"
2726
serde_derive = "1.0.0"
2827
typenum = "1.12.0"
2928
arbitrary = { version = "1.0", features = ["derive"], optional = true }
29+
context_deserialize = { version = "0.2", optional = true }
3030

31-
[features]
32-
arbitrary = ["dep:arbitrary", "alloy-primitives/arbitrary"]
31+
[dev-dependencies]
32+
alloy-primitives = { version = "1.0", features = ["getrandom"] }
33+
ethereum_ssz_derive = { version = "0.9.0", path = "../ssz_derive" }
34+
serde_json = "1.0.0"

ssz/src/context_deserialize.rs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
use crate::{Bitfield, Fixed, Variable};
2+
use context_deserialize::ContextDeserialize;
3+
use serde::{
4+
de::{Deserializer, Error},
5+
Deserialize,
6+
};
7+
use typenum::Unsigned;
8+
9+
impl<'de, C, N> ContextDeserialize<'de, C> for Bitfield<Variable<N>>
10+
where
11+
N: Unsigned + Clone,
12+
{
13+
fn context_deserialize<D>(deserializer: D, _context: C) -> Result<Self, D::Error>
14+
where
15+
D: Deserializer<'de>,
16+
{
17+
Bitfield::<Variable<N>>::deserialize(deserializer)
18+
.map_err(|e| D::Error::custom(format!("{:?}", e)))
19+
}
20+
}
21+
22+
impl<'de, C, N> ContextDeserialize<'de, C> for Bitfield<Fixed<N>>
23+
where
24+
N: Unsigned + Clone,
25+
{
26+
fn context_deserialize<D>(deserializer: D, _context: C) -> Result<Self, D::Error>
27+
where
28+
D: Deserializer<'de>,
29+
{
30+
Bitfield::<Fixed<N>>::deserialize(deserializer)
31+
.map_err(|e| D::Error::custom(format!("{:?}", e)))
32+
}
33+
}

ssz/src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ mod encode;
4040
pub mod legacy;
4141
mod union_selector;
4242

43+
#[cfg(feature = "context_deserialize")]
44+
mod context_deserialize;
45+
4346
pub use bitfield::bitvector_dynamic::{BitVectorDynamic, Dynamic};
4447
#[doc(hidden)]
4548
pub use bitfield::{BitList, BitVector, Bitfield, Error as BitfieldError, Fixed, Variable};

0 commit comments

Comments
 (0)