anvil_core/eth/
serde_helpers.rs

1//! custom serde helper functions
2
3pub 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
34/// A module that deserializes `[]` optionally
35pub 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
53/// A module that deserializes either a BlockNumberOrTag, or a simple number.
54pub mod lenient_block_number {
55    pub use alloy_eips::eip1898::LenientBlockNumberOrTag;
56    use alloy_rpc_types::BlockNumberOrTag;
57    use serde::{Deserialize, Deserializer};
58
59    /// deserializes either a BlockNumberOrTag, or a simple number.
60    pub use alloy_eips::eip1898::lenient_block_number_or_tag::deserialize as lenient_block_number;
61
62    /// Same as `lenient_block_number` but requires to be `[num; 1]`
63    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}