anvil_core/eth/
serde_helpers.rs
1pub mod sequence {
4 use serde::{
5 de::DeserializeOwned, ser::SerializeSeq, Deserialize, Deserializer, Serialize, Serializer,
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 use alloy_rpc_types::BlockNumberOrTag;
56 use serde::{Deserialize, Deserializer};
57
58 pub fn lenient_block_number<'de, D>(deserializer: D) -> Result<BlockNumberOrTag, D::Error>
78 where
79 D: Deserializer<'de>,
80 {
81 LenientBlockNumber::deserialize(deserializer).map(Into::into)
82 }
83
84 pub fn lenient_block_number_seq<'de, D>(deserializer: D) -> Result<BlockNumberOrTag, D::Error>
86 where
87 D: Deserializer<'de>,
88 {
89 let num = <[LenientBlockNumber; 1]>::deserialize(deserializer)?[0].into();
90 Ok(num)
91 }
92
93 #[derive(Clone, Copy, Deserialize)]
95 #[serde(untagged)]
96 pub enum LenientBlockNumber {
97 BlockNumber(BlockNumberOrTag),
98 Num(u64),
99 }
100
101 impl From<LenientBlockNumber> for BlockNumberOrTag {
102 fn from(b: LenientBlockNumber) -> Self {
103 match b {
104 LenientBlockNumber::BlockNumber(b) => b,
105 LenientBlockNumber::Num(b) => b.into(),
106 }
107 }
108 }
109}