rust_bigint/serialize/
vecbigint.rs

1//! Serialize a vector of BigInts. These functions can be used by serde
2
3use crate::BigInt;
4#[cfg(feature = "num_bigint")]
5use num_traits::Num;
6use serde::de::SeqAccess;
7use serde::ser::SerializeSeq;
8use serde::{de, ser};
9use std::fmt;
10
11pub fn serialize<S: ser::Serializer>(x: &[BigInt], serializer: S) -> Result<S::Ok, S::Error> {
12    let mut seq = serializer.serialize_seq(Some(x.len()))?;
13    for e in x {
14        seq.serialize_element(&e.to_str_radix(16))?;
15    }
16    seq.end()
17}
18
19pub fn deserialize<'de, D: de::Deserializer<'de>>(
20    deserializer: D,
21) -> Result<Vec<BigInt>, D::Error> {
22    struct VecBigIntVisitor;
23
24    impl<'de> de::Visitor<'de> for VecBigIntVisitor {
25        type Value = Vec<BigInt>;
26
27        fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
28            formatter.write_str("vector of bigint")
29        }
30
31        fn visit_seq<A>(self, mut seq: A) -> Result<Vec<BigInt>, A::Error>
32        where
33            A: SeqAccess<'de>,
34        {
35            let mut values: Vec<BigInt> = Vec::new();
36            while let Some(value) = seq.next_element::<String>()? {
37                values.push(BigInt::from_str_radix(&value, 16).unwrap());
38            }
39
40            Ok(values)
41        }
42    }
43
44    deserializer.deserialize_seq(VecBigIntVisitor)
45}