curv/arithmetic/
serde_support.rs1use 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}