flow_value/de/
const_bytes.rs

1pub struct ConstBytes<const N: usize>(pub [u8; N]);
2
3impl<const N: usize> serde::Serialize for ConstBytes<N> {
4    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
5    where
6        S: serde::Serializer,
7    {
8        serializer.serialize_bytes(&self.0)
9    }
10}
11
12impl<'de, const N: usize> serde::Deserialize<'de> for ConstBytes<N> {
13    fn deserialize<D>(d: D) -> Result<Self, D::Error>
14    where
15        D: serde::Deserializer<'de>,
16    {
17        d.deserialize_bytes(ConstBytesVisitor::<N>)
18    }
19}
20
21struct ConstBytesVisitor<const N: usize>;
22
23impl<'de, const N: usize> serde::de::Visitor<'de> for ConstBytesVisitor<N> {
24    type Value = ConstBytes<N>;
25
26    fn expecting(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
27        f.write_str("bytes")
28    }
29
30    fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
31    where
32        E: serde::de::Error,
33    {
34        Ok(ConstBytes(<[u8; N]>::try_from(v).map_err(|_| {
35            serde::de::Error::invalid_length(v.len(), &itoa::Buffer::new().format(N))
36        })?))
37    }
38
39    fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
40    where
41        A: serde::de::SeqAccess<'de>,
42    {
43        let size = seq.size_hint();
44        if let Some(size) = size
45            && size != N
46        {
47            return Err(serde::de::Error::invalid_length(
48                size,
49                &itoa::Buffer::new().format(N),
50            ));
51        }
52
53        let mut buf = [0u8; N];
54        for (i, b) in buf.iter_mut().enumerate() {
55            *b = seq.next_element::<u8>()?.ok_or_else(|| {
56                serde::de::Error::invalid_length(i, &itoa::Buffer::new().format(N))
57            })?;
58        }
59        if seq.next_element::<u8>()?.is_some() {
60            return Err(serde::de::Error::invalid_length(
61                N + 1,
62                &itoa::Buffer::new().format(N),
63            ));
64        }
65
66        Ok(ConstBytes(buf))
67    }
68}