polywrap_msgpack_serde/wrappers/
polywrap_bigint.rs1use 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}