polywrap_msgpack_serde/wrappers/
polywrap_bigint.rs

1use std::{
2    fmt::{self},
3    str::FromStr,
4};
5
6use num_bigint::BigInt;
7use serde::{de::Visitor, Deserialize, Serialize, Serializer, Deserializer};
8
9#[derive(Debug, PartialEq, Clone)]
10pub struct BigIntWrapper(pub BigInt);
11
12pub fn serialize<S>(x: &BigInt, s: S) -> Result<S::Ok, S::Error>
13where
14    S: Serializer,
15{
16    s.serialize_str(&x.to_string())
17}
18
19pub fn deserialize<'de, D>(deserializer: D) -> Result<BigInt, D::Error>
20where
21  D: Deserializer<'de>,
22{
23  Ok(deserializer.deserialize_str(BigIntStrVisitor)?.0)
24}
25
26impl Serialize for BigIntWrapper {
27    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
28    where
29        S: serde::Serializer,
30    {
31        serializer.serialize_str(&self.0.to_string())
32    }
33}
34
35struct BigIntStrVisitor;
36
37impl<'de> Visitor<'de> for BigIntStrVisitor {
38    type Value = BigIntWrapper;
39
40    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
41        formatter.write_str("a BigInt string")
42    }
43
44    fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
45    where
46        E: serde::de::Error,
47    {
48        let big_int = BigInt::from_str(v).map_err(|e| {
49            serde::de::Error::custom(format!("Error parsing BigInt: {e}"))
50        })?;
51
52        Ok(BigIntWrapper(big_int))
53    }
54}
55
56impl<'a> Deserialize<'a> for BigIntWrapper {
57    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
58    where
59        D: serde::Deserializer<'a>,
60    {
61        deserializer.deserialize_str(BigIntStrVisitor)
62    }
63}