use crate::{Numeric, visitor::VlenBytesVisitor};
use serde::de::Error;
pub fn serialize<S: serde::ser::Serializer, T: Numeric>(
value: &T,
serializer: S,
) -> core::result::Result<S::Ok, S::Error> {
serializer.serialize_bytes(&value.compact_encode())
}
pub fn deserialize<'de, D: serde::de::Deserializer<'de>, T: Numeric>(
deserializer: D,
) -> core::result::Result<T, D::Error> {
if deserializer.is_human_readable() {
match T::LENGTH {
1 => {
let value = deserializer.deserialize_u8(VlenBytesVisitor)?;
Ok(T::from_u64(value))
}
2 => {
let value = deserializer.deserialize_u16(VlenBytesVisitor)?;
Ok(T::from_u64(value))
}
4 => {
let value = deserializer.deserialize_u32(VlenBytesVisitor)?;
Ok(T::from_u64(value))
}
8 => {
let value = deserializer.deserialize_u64(VlenBytesVisitor)?;
Ok(T::from_u64(value))
}
_ => Err(D::Error::custom("Invalid length for compact number")),
}
} else {
let value = deserializer.deserialize_byte_buf(VlenBytesVisitor)?;
Ok(T::from_u64(value))
}
}