serde_byte_array/
ser.rs

1use crate::ByteArray;
2use serde::Serializer;
3
4/// Types that can be serialized via `#[serde(with = "serde_byte_array")]`.
5pub trait Serialize {
6    #[allow(missing_docs)]
7    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
8    where
9        S: Serializer;
10}
11
12impl<const N: usize> Serialize for [u8; N] {
13    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
14    where
15        S: Serializer,
16    {
17        serializer.serialize_bytes(self)
18    }
19}
20
21impl<const N: usize> Serialize for ByteArray<N> {
22    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
23    where
24        S: Serializer,
25    {
26        serializer.serialize_bytes(&**self)
27    }
28}
29
30impl<'a, T: Serialize> Serialize for &'a T {
31    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
32    where
33        S: Serializer,
34    {
35        (*self).serialize(serializer)
36    }
37}
38
39impl<T> Serialize for Option<T>
40where
41    T: Serialize,
42{
43    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
44    where
45        S: Serializer,
46    {
47        struct AsBytes<T>(T);
48
49        impl<T> serde::Serialize for AsBytes<T>
50        where
51            T: Serialize,
52        {
53            fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
54            where
55                S: Serializer,
56            {
57                self.0.serialize(serializer)
58            }
59        }
60
61        match self {
62            Some(b) => serializer.serialize_some(&AsBytes(b)),
63            None => serializer.serialize_none(),
64        }
65    }
66}