anvil_core/eth/
serde_helpers.rs
1pub mod sequence {
4 use serde::{
5 Deserialize, Deserializer, Serialize, Serializer, de::DeserializeOwned, ser::SerializeSeq,
6 };
7
8 pub fn serialize<S, T>(val: &T, s: S) -> Result<S::Ok, S::Error>
9 where
10 S: Serializer,
11 T: Serialize,
12 {
13 let mut seq = s.serialize_seq(Some(1))?;
14 seq.serialize_element(val)?;
15 seq.end()
16 }
17
18 pub fn deserialize<'de, T, D>(d: D) -> Result<T, D::Error>
19 where
20 D: Deserializer<'de>,
21 T: DeserializeOwned,
22 {
23 let mut seq = Vec::<T>::deserialize(d)?;
24 if seq.len() != 1 {
25 return Err(serde::de::Error::custom(format!(
26 "expected params sequence with length 1 but got {}",
27 seq.len()
28 )));
29 }
30 Ok(seq.remove(0))
31 }
32}
33
34pub mod empty_params {
36 use serde::{Deserialize, Deserializer};
37
38 pub fn deserialize<'de, D>(d: D) -> Result<(), D::Error>
39 where
40 D: Deserializer<'de>,
41 {
42 let seq = Option::<Vec<()>>::deserialize(d)?.unwrap_or_default();
43 if !seq.is_empty() {
44 return Err(serde::de::Error::custom(format!(
45 "expected params sequence with length 0 but got {}",
46 seq.len()
47 )));
48 }
49 Ok(())
50 }
51}
52
53pub mod lenient_block_number {
55 pub use alloy_eips::eip1898::LenientBlockNumberOrTag;
56 use alloy_rpc_types::BlockNumberOrTag;
57 use serde::{Deserialize, Deserializer};
58
59 pub use alloy_eips::eip1898::lenient_block_number_or_tag::deserialize as lenient_block_number;
61
62 pub fn lenient_block_number_seq<'de, D>(deserializer: D) -> Result<BlockNumberOrTag, D::Error>
64 where
65 D: Deserializer<'de>,
66 {
67 let num = <[LenientBlockNumberOrTag; 1]>::deserialize(deserializer)?[0].into();
68 Ok(num)
69 }
70}