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
23pub 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}