use serde::de::{self, Deserializer, SeqAccess, Visitor};
use serde::ser::Serializer;
use std::fmt;
pub mod u128_bytes {
use super::*;
pub fn serialize<S: Serializer>(val: &u128, ser: S) -> Result<S::Ok, S::Error> {
ser.serialize_bytes(&val.to_be_bytes())
}
pub fn deserialize<'de, D: Deserializer<'de>>(de: D) -> Result<u128, D::Error> {
struct U128Visitor;
impl<'de> Visitor<'de> for U128Visitor {
type Value = u128;
fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.write_str("16 bytes for u128")
}
fn visit_bytes<E: de::Error>(self, v: &[u8]) -> Result<u128, E> {
let arr: [u8; 16] = v
.try_into()
.map_err(|_| E::invalid_length(v.len(), &"16 bytes"))?;
Ok(u128::from_be_bytes(arr))
}
fn visit_seq<A: SeqAccess<'de>>(self, mut seq: A) -> Result<u128, A::Error> {
let mut bytes = [0u8; 16];
for (i, byte) in bytes.iter_mut().enumerate() {
*byte = seq
.next_element()?
.ok_or_else(|| de::Error::invalid_length(i, &"16 bytes"))?;
}
Ok(u128::from_be_bytes(bytes))
}
}
de.deserialize_bytes(U128Visitor)
}
}
pub mod option_u128_bytes {
use super::*;
pub fn serialize<S: Serializer>(val: &Option<u128>, ser: S) -> Result<S::Ok, S::Error> {
match val {
Some(v) => ser.serialize_bytes(&v.to_be_bytes()),
None => ser.serialize_none(),
}
}
pub fn deserialize<'de, D: Deserializer<'de>>(de: D) -> Result<Option<u128>, D::Error> {
struct OptU128Visitor;
impl<'de> Visitor<'de> for OptU128Visitor {
type Value = Option<u128>;
fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.write_str("null or 16 bytes for u128")
}
fn visit_none<E: de::Error>(self) -> Result<Option<u128>, E> {
Ok(None)
}
fn visit_some<D2: Deserializer<'de>>(self, de: D2) -> Result<Option<u128>, D2::Error> {
super::u128_bytes::deserialize(de).map(Some)
}
fn visit_bytes<E: de::Error>(self, v: &[u8]) -> Result<Option<u128>, E> {
let arr: [u8; 16] = v
.try_into()
.map_err(|_| E::invalid_length(v.len(), &"16 bytes"))?;
Ok(Some(u128::from_be_bytes(arr)))
}
}
de.deserialize_option(OptU128Visitor)
}
}
pub mod vec_u128_bytes {
use super::*;
pub fn serialize<S: Serializer>(val: &[u128], ser: S) -> Result<S::Ok, S::Error> {
use serde::ser::SerializeSeq;
let mut seq = ser.serialize_seq(Some(val.len()))?;
for v in val {
seq.serialize_element(&v.to_be_bytes())?; }
seq.end()
}
pub fn deserialize<'de, D: Deserializer<'de>>(de: D) -> Result<Vec<u128>, D::Error> {
struct VecU128Visitor;
impl<'de> Visitor<'de> for VecU128Visitor {
type Value = Vec<u128>;
fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.write_str("sequence of 16-byte u128 values")
}
fn visit_seq<A: SeqAccess<'de>>(self, mut seq: A) -> Result<Vec<u128>, A::Error> {
let mut out = Vec::with_capacity(seq.size_hint().unwrap_or(0));
while let Some(arr) = seq.next_element::<[u8; 16]>()? {
out.push(u128::from_be_bytes(arr));
}
Ok(out)
}
}
de.deserialize_seq(VecU128Visitor)
}
}