tycho_execution/encoding/
serde_primitives.rs

1use std::str::FromStr;
2
3use num_bigint::BigUint;
4use serde::{self, Deserialize, Deserializer, Serializer};
5
6fn serialize_biguint<S>(value: &BigUint, serializer: S) -> Result<S::Ok, S::Error>
7where
8    S: Serializer,
9{
10    serializer.serialize_str(&value.to_string())
11}
12
13fn deserialize_biguint<'de, D>(deserializer: D) -> Result<BigUint, D::Error>
14where
15    D: Deserializer<'de>,
16{
17    let s = String::deserialize(deserializer)?;
18    BigUint::from_str(&s).map_err(serde::de::Error::custom)
19}
20
21pub mod biguint_string {
22    use super::*;
23
24    pub fn serialize<S>(value: &BigUint, serializer: S) -> Result<S::Ok, S::Error>
25    where
26        S: Serializer,
27    {
28        serialize_biguint(value, serializer)
29    }
30
31    pub fn deserialize<'de, D>(deserializer: D) -> Result<BigUint, D::Error>
32    where
33        D: Deserializer<'de>,
34    {
35        deserialize_biguint(deserializer)
36    }
37}
38
39pub mod biguint_string_option {
40    use super::*;
41
42    pub fn serialize<S>(value: &Option<BigUint>, serializer: S) -> Result<S::Ok, S::Error>
43    where
44        S: Serializer,
45    {
46        match value {
47            Some(v) => serialize_biguint(v, serializer),
48            None => serializer.serialize_none(),
49        }
50    }
51
52    pub fn deserialize<'de, D>(deserializer: D) -> Result<Option<BigUint>, D::Error>
53    where
54        D: Deserializer<'de>,
55    {
56        Option::<String>::deserialize(deserializer)?
57            .map(|s| BigUint::from_str(&s).map_err(serde::de::Error::custom))
58            .transpose()
59    }
60}