curv/arithmetic/
serde_support.rs

1use std::fmt;
2
3use serde::de::{Error, SeqAccess, Visitor};
4use serde::{Deserialize, Deserializer, Serialize, Serializer};
5
6use super::traits::Converter;
7use super::BigInt;
8
9impl Serialize for BigInt {
10    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
11    where
12        S: Serializer,
13    {
14        let bytes = self.to_bytes();
15        if !serializer.is_human_readable() {
16            serializer.serialize_bytes(&bytes)
17        } else {
18            serializer.serialize_str(&hex::encode(bytes))
19        }
20    }
21}
22
23impl<'de> Deserialize<'de> for BigInt {
24    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
25    where
26        D: Deserializer<'de>,
27    {
28        struct BigintVisitor;
29
30        impl<'de> Visitor<'de> for BigintVisitor {
31            type Value = BigInt;
32
33            fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
34                write!(f, "bigint")
35            }
36
37            fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
38            where
39                E: serde::de::Error,
40            {
41                Ok(BigInt::from_bytes(v))
42            }
43
44            fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
45            where
46                A: SeqAccess<'de>,
47            {
48                let mut bytes = vec![];
49                while let Some(byte) = seq.next_element::<u8>()? {
50                    bytes.push(byte)
51                }
52                Ok(BigInt::from_bytes(&bytes))
53            }
54
55            fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
56            where
57                E: Error,
58            {
59                let bytes = hex::decode(v).map_err(|_| E::custom("malformed hex encoding"))?;
60                Ok(BigInt::from_bytes(&bytes))
61            }
62        }
63
64        if !deserializer.is_human_readable() {
65            deserializer.deserialize_bytes(BigintVisitor)
66        } else {
67            deserializer.deserialize_str(BigintVisitor)
68        }
69    }
70}