pub mod biguint {
use num_bigint::BigUint;
use serde::{Serializer, Deserializer};
use serde_bytes;
pub fn serialize<S>(bn: &BigUint, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let mut bytes = bn.to_bytes_be();
if bytes.len() == 1 && bytes[0] == 0 {
bytes.pop();
}
serde_bytes::serialize(&bytes, serializer)
}
pub fn deserialize<'de, D>(deserializer: D) -> Result<BigUint, D::Error>
where
D: Deserializer<'de>,
{
let slice: &[u8] = serde_bytes::deserialize(deserializer)?;
Ok(BigUint::from_bytes_be(slice))
}
}
pub mod byte_array {
use core::convert::TryInto;
use serde::de::Error;
use serde::{Deserializer, Serializer};
pub fn serialize<S>(key: &[u8], serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
serde_bytes::serialize(key, serializer)
}
pub fn deserialize<'de, D, const N: usize>(deserializer: D) -> Result<[u8; N], D::Error>
where
D: Deserializer<'de>,
{
let slice: &[u8] = serde_bytes::deserialize(deserializer)?;
slice.try_into().map_err(|_| {
let expected = format!("[u8; {}]", N);
D::Error::invalid_length(slice.len(), &expected.as_str())
})
}
}