serde_jam/with/
compact.rs1use crate::{Numeric, visitor::VlenBytesVisitor};
4use serde::de::Error;
5
6pub fn serialize<S: serde::ser::Serializer, T: Numeric>(
8 value: &T,
9 serializer: S,
10) -> core::result::Result<S::Ok, S::Error> {
11 serializer.serialize_bytes(&value.compact_encode())
12}
13
14pub fn deserialize<'de, D: serde::de::Deserializer<'de>, T: Numeric>(
16 deserializer: D,
17) -> core::result::Result<T, D::Error> {
18 if deserializer.is_human_readable() {
19 match T::LENGTH {
21 1 => {
22 let value = deserializer.deserialize_u8(VlenBytesVisitor)?;
23 Ok(T::from_u64(value))
24 }
25 2 => {
26 let value = deserializer.deserialize_u16(VlenBytesVisitor)?;
27 Ok(T::from_u64(value))
28 }
29 4 => {
30 let value = deserializer.deserialize_u32(VlenBytesVisitor)?;
31 Ok(T::from_u64(value))
32 }
33 8 => {
34 let value = deserializer.deserialize_u64(VlenBytesVisitor)?;
35 Ok(T::from_u64(value))
36 }
37 _ => Err(D::Error::custom("Invalid length for compact number")),
38 }
39 } else {
40 let value = deserializer.deserialize_byte_buf(VlenBytesVisitor)?;
42 Ok(T::from_u64(value))
43 }
44}