Skip to content

Commit 31f62dd

Browse files
committed
simplify (de)serialize for octets
1 parent ce666aa commit 31f62dd

File tree

1 file changed

+22
-148
lines changed

1 file changed

+22
-148
lines changed

src/serde.rs

+22-148
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,24 @@
33
//! [Serde](https://serde.rs/) supports native serialization of octets
44
//! sequences. However, because of missing specialization, it has to
55
//! serialize the octets slices and vec as literal sequences of `u8`s. In
6-
//! order to allow octets sequences their own native serialization, the crate
7-
//! defines two traits [`SerializeOctets`] and [`DeserializeOctets`] if
8-
//! built with the `serde` feature enabled.
6+
//! order to allow octets sequences their own native deserialization, the
7+
//! crate defines the trait [`DeserializeOctets`] if built with the `serde`
8+
//! feature enabled.
99
#![cfg(feature = "serde")]
1010

1111
use core::fmt;
1212
use core::marker::PhantomData;
1313
use serde::de::Visitor;
1414

15-
pub fn serialize<Octs, S>(octs: &Octs, serializer: S) -> Result<S::Ok, S::Error>
15+
pub fn serialize<Octs, S>(
16+
octs: &Octs,
17+
serializer: S,
18+
) -> Result<S::Ok, S::Error>
1619
where
1720
S: serde::Serializer,
1821
Octs: AsRef<[u8]> + ?Sized,
1922
{
20-
octs.as_ref().serialize_octets(serializer)
23+
serializer.serialize_bytes(octs.as_ref())
2124
}
2225

2326
pub fn deserialize<'de, Octs, D>(deserializer: D) -> Result<Octs, D::Error>
@@ -28,109 +31,38 @@ where
2831
Octs::deserialize_octets(deserializer)
2932
}
3033

31-
//------------ SerializeOctets -----------------------------------------------
32-
33-
pub trait SerializeOctets {
34-
fn serialize_octets<S: serde::Serializer>(
35-
&self, serializer: S
36-
) -> Result<S::Ok, S::Error>;
37-
38-
fn as_serialized_octets(&self) -> AsSerializedOctets<Self> {
39-
AsSerializedOctets(self)
40-
}
41-
}
42-
43-
impl SerializeOctets for [u8] {
44-
fn serialize_octets<S: serde::Serializer>(
45-
&self, serializer: S
46-
) -> Result<S::Ok, S::Error> {
47-
serializer.serialize_bytes(self)
48-
}
49-
}
50-
51-
impl<'a> SerializeOctets for &'a [u8] {
52-
fn serialize_octets<S: serde::Serializer>(
53-
&self, serializer: S
54-
) -> Result<S::Ok, S::Error> {
55-
serializer.serialize_bytes(self)
56-
}
57-
}
58-
59-
#[cfg(feature = "std")]
60-
impl<'a> SerializeOctets for std::borrow::Cow<'a, [u8]> {
61-
fn serialize_octets<S: serde::Serializer>(
62-
&self, serializer: S
63-
) -> Result<S::Ok, S::Error> {
64-
serializer.serialize_bytes(self.as_ref())
65-
}
66-
}
67-
68-
#[cfg(feature = "std")]
69-
impl SerializeOctets for std::vec::Vec<u8> {
70-
fn serialize_octets<S: serde::Serializer>(
71-
&self, serializer: S
72-
) -> Result<S::Ok, S::Error> {
73-
serializer.serialize_bytes(self.as_ref())
74-
}
75-
}
76-
77-
#[cfg(feature = "bytes")]
78-
impl SerializeOctets for bytes::Bytes {
79-
fn serialize_octets<S: serde::Serializer>(
80-
&self, serializer: S
81-
) -> Result<S::Ok, S::Error> {
82-
serializer.serialize_bytes(self.as_ref())
83-
}
84-
}
85-
86-
#[cfg(feature = "smallvec")]
87-
impl<A> SerializeOctets for smallvec::SmallVec<A>
88-
where A: smallvec::Array<Item = u8> {
89-
fn serialize_octets<S: serde::Serializer>(
90-
&self, serializer: S
91-
) -> Result<S::Ok, S::Error> {
92-
serializer.serialize_bytes(self.as_ref())
93-
}
94-
}
95-
96-
#[cfg(feature = "heapless")]
97-
impl<const N: usize> SerializeOctets for heapless::Vec<u8, N> {
98-
fn serialize_octets<S: serde::Serializer>(
99-
&self, serializer: S
100-
) -> Result<S::Ok, S::Error> {
101-
serializer.serialize_bytes(self.as_ref())
102-
}
103-
}
104-
105-
106-
//------------ AsSerializedOctets --------------------------------------------
34+
//------------ OctetsSerializer --------------------------------------------
10735

10836
/// A wrapper forcing a value to serialize through its octets.
10937
///
11038
/// This type can be used where a `Serialize` value is required.
111-
pub struct AsSerializedOctets<'a, T: ?Sized>(&'a T);
39+
pub struct AsSerializedOctets<'a>(&'a [u8]);
11240

113-
impl<'a, T: SerializeOctets> serde::Serialize for AsSerializedOctets<'a, T>
114-
where
115-
T: SerializeOctets + ?Sized
116-
{
41+
impl<'a> serde::Serialize for AsSerializedOctets<'a> {
11742
fn serialize<S: serde::Serializer>(
11843
&self,
11944
serializer: S,
12045
) -> Result<S::Ok, S::Error> {
121-
self.0.serialize_octets(serializer)
46+
serialize(&self.0, serializer)
12247
}
12348
}
12449

50+
impl<'a, T: AsRef<[u8]> + ?Sized> From<&'a T> for AsSerializedOctets<'a> {
51+
fn from(value: &'a T) -> Self {
52+
AsSerializedOctets(value.as_ref())
53+
}
54+
}
12555

12656
//------------ DeserializeOctets ---------------------------------------------
12757

12858
pub trait DeserializeOctets<'de>: Sized {
12959
type Visitor: Visitor<'de, Value = Self>;
13060

13161
fn deserialize_octets<D: serde::Deserializer<'de>>(
132-
deserializer: D
133-
) -> Result<Self, D::Error>;
62+
deserializer: D,
63+
) -> Result<Self, D::Error> {
64+
Self::deserialize_with_visitor(deserializer, Self::visitor())
65+
}
13466

13567
fn deserialize_with_visitor<
13668
D: serde::Deserializer<'de>,
@@ -146,12 +78,6 @@ pub trait DeserializeOctets<'de>: Sized {
14678
impl<'de> DeserializeOctets<'de> for &'de [u8] {
14779
type Visitor = BorrowedVisitor<Self>;
14880

149-
fn deserialize_octets<D: serde::Deserializer<'de>>(
150-
deserializer: D,
151-
) -> Result<Self, D::Error> {
152-
Self::visitor().deserialize(deserializer)
153-
}
154-
15581
fn deserialize_with_visitor<D, V>(
15682
deserializer: D,
15783
visitor: V,
@@ -175,7 +101,7 @@ impl<'de> DeserializeOctets<'de> for std::borrow::Cow<'de, [u8]> {
175101
fn deserialize_octets<D: serde::Deserializer<'de>>(
176102
deserializer: D,
177103
) -> Result<Self, D::Error> {
178-
Self::visitor().deserialize(deserializer)
104+
Self::deserialize_with_visitor(deserializer, Self::visitor())
179105
}
180106

181107
fn deserialize_with_visitor<D, V>(
@@ -198,12 +124,6 @@ impl<'de> DeserializeOctets<'de> for std::borrow::Cow<'de, [u8]> {
198124
impl<'de> DeserializeOctets<'de> for std::vec::Vec<u8> {
199125
type Visitor = BufVisitor<Self>;
200126

201-
fn deserialize_octets<D: serde::Deserializer<'de>>(
202-
deserializer: D,
203-
) -> Result<Self, D::Error> {
204-
Self::visitor().deserialize(deserializer)
205-
}
206-
207127
fn deserialize_with_visitor<D, V>(
208128
deserializer: D,
209129
visitor: V,
@@ -224,12 +144,6 @@ impl<'de> DeserializeOctets<'de> for std::vec::Vec<u8> {
224144
impl<'de> DeserializeOctets<'de> for bytes::Bytes {
225145
type Visitor = BufVisitor<Self>;
226146

227-
fn deserialize_octets<D: serde::Deserializer<'de>>(
228-
deserializer: D,
229-
) -> Result<Self, D::Error> {
230-
Self::visitor().deserialize(deserializer)
231-
}
232-
233147
fn deserialize_with_visitor<D, V>(
234148
deserializer: D,
235149
visitor: V,
@@ -253,12 +167,6 @@ where
253167
{
254168
type Visitor = BufVisitor<Self>;
255169

256-
fn deserialize_octets<D: serde::Deserializer<'de>>(
257-
deserializer: D,
258-
) -> Result<Self, D::Error> {
259-
Self::visitor().deserialize(deserializer)
260-
}
261-
262170
fn deserialize_with_visitor<D, V>(
263171
deserializer: D,
264172
visitor: V,
@@ -279,12 +187,6 @@ where
279187
impl<'de, const N: usize> DeserializeOctets<'de> for heapless::Vec<u8, N> {
280188
type Visitor = HeaplessVecVisitor<N>;
281189

282-
fn deserialize_octets<D: serde::Deserializer<'de>>(
283-
deserializer: D,
284-
) -> Result<Self, D::Error> {
285-
Self::visitor().deserialize(deserializer)
286-
}
287-
288190
fn deserialize_with_visitor<D, V>(
289191
deserializer: D,
290192
visitor: V,
@@ -309,16 +211,6 @@ impl<T> BorrowedVisitor<T> {
309211
fn new() -> Self {
310212
BorrowedVisitor(PhantomData)
311213
}
312-
313-
pub fn deserialize<'de, D: serde::Deserializer<'de>>(
314-
self,
315-
deserializer: D,
316-
) -> Result<T, D::Error>
317-
where
318-
T: From<&'de [u8]>,
319-
{
320-
deserializer.deserialize_bytes(self)
321-
}
322214
}
323215

324216
impl<'de, T> serde::de::Visitor<'de> for BorrowedVisitor<T>
@@ -349,16 +241,6 @@ impl<T> BufVisitor<T> {
349241
fn new() -> Self {
350242
BufVisitor(PhantomData)
351243
}
352-
353-
pub fn deserialize<'de, D: serde::Deserializer<'de>>(
354-
self,
355-
deserializer: D,
356-
) -> Result<T, D::Error>
357-
where
358-
T: From<std::vec::Vec<u8>>,
359-
{
360-
deserializer.deserialize_byte_buf(self)
361-
}
362244
}
363245

364246
#[cfg(feature = "std")]
@@ -387,7 +269,6 @@ where
387269
}
388270
}
389271

390-
391272
//------------ HeaplessVisitor -----------------------------------------------
392273

393274
#[cfg(feature = "heapless")]
@@ -398,13 +279,6 @@ impl<const N: usize> HeaplessVecVisitor<N> {
398279
fn new() -> Self {
399280
Self
400281
}
401-
402-
pub fn deserialize<'de, D: serde::Deserializer<'de>>(
403-
self,
404-
deserializer: D,
405-
) -> Result<heapless::Vec<u8, N>, D::Error> {
406-
deserializer.deserialize_byte_buf(self)
407-
}
408282
}
409283

410284
#[cfg(feature = "heapless")]

0 commit comments

Comments
 (0)