serde_human_bytes/
ser.rs

1use crate::{ByteArray, Bytes};
2use serde::Serializer;
3
4use crate::ByteBuf;
5
6use alloc::borrow::Cow;
7
8use alloc::boxed::Box;
9
10use alloc::vec::Vec;
11
12pub(crate) fn serialize_bytes<S>(bytes: &[u8], serializer: S) -> Result<S::Ok, S::Error>
13where
14    S: Serializer,
15{
16    if serializer.is_human_readable() {
17        serializer.serialize_str(&hex::encode(bytes))
18    } else {
19        serializer.serialize_bytes(bytes)
20    }
21}
22
23/// Types that can be serialized via `#[serde(with = "serde_human_bytes")]`.
24pub trait Serialize {
25    #[allow(missing_docs)]
26    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
27    where
28        S: Serializer;
29}
30
31impl Serialize for [u8] {
32    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
33    where
34        S: Serializer,
35    {
36        serialize_bytes(self, serializer)
37    }
38}
39
40impl Serialize for Vec<u8> {
41    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
42    where
43        S: Serializer,
44    {
45        serialize_bytes(self, serializer)
46    }
47}
48
49impl Serialize for Bytes {
50    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
51    where
52        S: Serializer,
53    {
54        serialize_bytes(self, serializer)
55    }
56}
57
58impl<const N: usize> Serialize for [u8; N] {
59    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
60    where
61        S: Serializer,
62    {
63        serialize_bytes(self, serializer)
64    }
65}
66
67impl<const N: usize> Serialize for ByteArray<N> {
68    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
69    where
70        S: Serializer,
71    {
72        serialize_bytes(&**self, serializer)
73    }
74}
75
76impl Serialize for ByteBuf {
77    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
78    where
79        S: Serializer,
80    {
81        serialize_bytes(self, serializer)
82    }
83}
84
85impl<'a> Serialize for Cow<'a, [u8]> {
86    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
87    where
88        S: Serializer,
89    {
90        serialize_bytes(self, serializer)
91    }
92}
93
94impl<'a> Serialize for Cow<'a, Bytes> {
95    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
96    where
97        S: Serializer,
98    {
99        serialize_bytes(self, serializer)
100    }
101}
102
103impl<T> Serialize for &T
104where
105    T: ?Sized + Serialize,
106{
107    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
108    where
109        S: Serializer,
110    {
111        (**self).serialize(serializer)
112    }
113}
114
115impl<T> Serialize for Box<T>
116where
117    T: ?Sized + Serialize,
118{
119    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
120    where
121        S: Serializer,
122    {
123        (**self).serialize(serializer)
124    }
125}
126
127impl<T> Serialize for Option<T>
128where
129    T: Serialize,
130{
131    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
132    where
133        S: Serializer,
134    {
135        struct AsBytes<T>(T);
136
137        impl<T> serde::Serialize for AsBytes<T>
138        where
139            T: Serialize,
140        {
141            fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
142            where
143                S: Serializer,
144            {
145                self.0.serialize(serializer)
146            }
147        }
148
149        match self {
150            Some(b) => serializer.serialize_some(&AsBytes(b)),
151            None => serializer.serialize_none(),
152        }
153    }
154}