dashu_int/third_party/
serde.rs1use crate::{convert::words_to_le_bytes, ibig::IBig, ubig::UBig, Sign};
4use core::fmt::{self, Formatter};
5use serde::{
6 de::{self, Deserialize, Deserializer, Visitor},
7 ser::{Serialize, Serializer},
8};
9
10impl Serialize for UBig {
11 #[inline]
12 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
13 if serializer.is_human_readable() {
14 serializer.collect_str(self)
15 } else if self.is_zero() {
16 serializer.serialize_bytes(&[])
17 } else {
18 let bytes = words_to_le_bytes(self.as_words());
19 serializer.serialize_bytes(&bytes)
20 }
21 }
22}
23
24impl<'de> Deserialize<'de> for UBig {
25 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
26 if deserializer.is_human_readable() {
27 deserializer.deserialize_str(UBigVisitor)
28 } else {
29 deserializer.deserialize_bytes(UBigVisitor)
30 }
31 }
32}
33
34struct UBigVisitor;
36
37impl<'de> Visitor<'de> for UBigVisitor {
38 type Value = UBig;
39
40 fn expecting(&self, f: &mut Formatter) -> fmt::Result {
41 write!(f, "a string or a sequence of bytes")
42 }
43
44 fn visit_str<E: de::Error>(self, v: &str) -> Result<Self::Value, E> {
45 match UBig::from_str_with_radix_prefix(v) {
46 Ok((n, _)) => Ok(n),
47 Err(e) => Err(de::Error::custom(e)),
48 }
49 }
50
51 fn visit_bytes<E: de::Error>(self, v: &[u8]) -> Result<Self::Value, E> {
52 Ok(UBig::from_le_bytes(v))
53 }
54}
55
56impl Serialize for IBig {
57 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
58 if serializer.is_human_readable() {
59 serializer.collect_str(self)
60 } else if self.is_zero() {
61 serializer.serialize_bytes(&[])
62 } else {
63 let (sign, words) = self.as_sign_words();
64 let mut bytes = words_to_le_bytes(words);
65
66 if (sign == Sign::Positive && bytes.len() & 1 == 1)
69 || (sign == Sign::Negative && bytes.len() & 1 == 0)
70 {
71 bytes.push(0);
72 }
73 serializer.serialize_bytes(&bytes)
74 }
75 }
76}
77
78impl<'de> Deserialize<'de> for IBig {
79 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
80 if deserializer.is_human_readable() {
81 deserializer.deserialize_str(IBigVisitor)
82 } else {
83 deserializer.deserialize_bytes(IBigVisitor)
84 }
85 }
86}
87
88struct IBigVisitor;
90
91impl<'de> Visitor<'de> for IBigVisitor {
92 type Value = IBig;
93
94 fn expecting(&self, f: &mut Formatter) -> fmt::Result {
95 write!(f, "a string or a sequence of 64-bit words")
96 }
97
98 fn visit_str<E: de::Error>(self, v: &str) -> Result<Self::Value, E> {
99 match IBig::from_str_with_radix_prefix(v) {
100 Ok((n, _)) => Ok(n),
101 Err(e) => Err(de::Error::custom(e)),
102 }
103 }
104
105 fn visit_bytes<E: de::Error>(self, v: &[u8]) -> Result<Self::Value, E> {
106 let sign = Sign::from(v.len() & 1 == 1);
107 Ok(IBig::from_parts(sign, UBig::from_le_bytes(v)))
108 }
109}