tycho_execution/encoding/
serde_primitives.rs1use 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}