serde_jam/with/
compact.rs

1//! Serialize and deserialize fixed byte array that larger than 32 bytes.
2
3use crate::{Numeric, visitor::VlenBytesVisitor};
4use serde::de::Error;
5
6/// Serialize compact number.
7pub 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
14/// Deserialize compact number.
15pub 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        // JSON: deserialize as regular integer
20        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        // Binary: use compact decoding
41        let value = deserializer.deserialize_byte_buf(VlenBytesVisitor)?;
42        Ok(T::from_u64(value))
43    }
44}