Skip to main content

kaspa_utils/serde_bytes_fixed/
ser.rs

1use serde::ser::SerializeTuple;
2use serde::Serializer;
3use std::str;
4
5/// Trait for serialization of types which can be referenced as fixed-size byte arrays.
6pub trait Serialize<const N: usize> {
7    /// Serialize `self` using the provided Serializer.
8    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
9    where
10        S: Serializer;
11}
12
13impl<const N: usize> Serialize<N> for [u8; N] {
14    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
15    where
16        S: Serializer,
17    {
18        if serializer.is_human_readable() {
19            let mut hex = vec![0u8; self.len() * 2];
20            faster_hex::hex_encode(self, &mut hex[..]).map_err(serde::ser::Error::custom)?;
21            serializer.serialize_str(unsafe { str::from_utf8_unchecked(&hex) })
22        } else {
23            let mut t = serializer.serialize_tuple(self.len())?;
24            for v in self {
25                t.serialize_element(v)?;
26            }
27            t.end()
28        }
29    }
30}