flow_value/de/
const_bytes.rs1pub 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}