3
3
//! [Serde](https://serde.rs/) supports native serialization of octets
4
4
//! sequences. However, because of missing specialization, it has to
5
5
//! 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.
9
9
#![ cfg( feature = "serde" ) ]
10
10
11
11
use core:: fmt;
12
12
use core:: marker:: PhantomData ;
13
13
use serde:: de:: Visitor ;
14
14
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 >
16
19
where
17
20
S : serde:: Serializer ,
18
21
Octs : AsRef < [ u8 ] > + ?Sized ,
19
22
{
20
- octs. as_ref ( ) . serialize_octets ( serializer )
23
+ serializer . serialize_bytes ( octs. as_ref ( ) )
21
24
}
22
25
23
26
pub fn deserialize < ' de , Octs , D > ( deserializer : D ) -> Result < Octs , D :: Error >
@@ -28,109 +31,38 @@ where
28
31
Octs :: deserialize_octets ( deserializer)
29
32
}
30
33
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 --------------------------------------------
107
35
108
36
/// A wrapper forcing a value to serialize through its octets.
109
37
///
110
38
/// 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 ] ) ;
112
40
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 > {
117
42
fn serialize < S : serde:: Serializer > (
118
43
& self ,
119
44
serializer : S ,
120
45
) -> Result < S :: Ok , S :: Error > {
121
- self . 0 . serialize_octets ( serializer)
46
+ serialize ( & self . 0 , serializer)
122
47
}
123
48
}
124
49
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
+ }
125
55
126
56
//------------ DeserializeOctets ---------------------------------------------
127
57
128
58
pub trait DeserializeOctets < ' de > : Sized {
129
59
type Visitor : Visitor < ' de , Value = Self > ;
130
60
131
61
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
+ }
134
66
135
67
fn deserialize_with_visitor <
136
68
D : serde:: Deserializer < ' de > ,
@@ -146,12 +78,6 @@ pub trait DeserializeOctets<'de>: Sized {
146
78
impl < ' de > DeserializeOctets < ' de > for & ' de [ u8 ] {
147
79
type Visitor = BorrowedVisitor < Self > ;
148
80
149
- fn deserialize_octets < D : serde:: Deserializer < ' de > > (
150
- deserializer : D ,
151
- ) -> Result < Self , D :: Error > {
152
- Self :: visitor ( ) . deserialize ( deserializer)
153
- }
154
-
155
81
fn deserialize_with_visitor < D , V > (
156
82
deserializer : D ,
157
83
visitor : V ,
@@ -175,7 +101,7 @@ impl<'de> DeserializeOctets<'de> for std::borrow::Cow<'de, [u8]> {
175
101
fn deserialize_octets < D : serde:: Deserializer < ' de > > (
176
102
deserializer : D ,
177
103
) -> Result < Self , D :: Error > {
178
- Self :: visitor ( ) . deserialize ( deserializer )
104
+ Self :: deserialize_with_visitor ( deserializer , Self :: visitor ( ) )
179
105
}
180
106
181
107
fn deserialize_with_visitor < D , V > (
@@ -198,12 +124,6 @@ impl<'de> DeserializeOctets<'de> for std::borrow::Cow<'de, [u8]> {
198
124
impl < ' de > DeserializeOctets < ' de > for std:: vec:: Vec < u8 > {
199
125
type Visitor = BufVisitor < Self > ;
200
126
201
- fn deserialize_octets < D : serde:: Deserializer < ' de > > (
202
- deserializer : D ,
203
- ) -> Result < Self , D :: Error > {
204
- Self :: visitor ( ) . deserialize ( deserializer)
205
- }
206
-
207
127
fn deserialize_with_visitor < D , V > (
208
128
deserializer : D ,
209
129
visitor : V ,
@@ -224,12 +144,6 @@ impl<'de> DeserializeOctets<'de> for std::vec::Vec<u8> {
224
144
impl < ' de > DeserializeOctets < ' de > for bytes:: Bytes {
225
145
type Visitor = BufVisitor < Self > ;
226
146
227
- fn deserialize_octets < D : serde:: Deserializer < ' de > > (
228
- deserializer : D ,
229
- ) -> Result < Self , D :: Error > {
230
- Self :: visitor ( ) . deserialize ( deserializer)
231
- }
232
-
233
147
fn deserialize_with_visitor < D , V > (
234
148
deserializer : D ,
235
149
visitor : V ,
@@ -253,12 +167,6 @@ where
253
167
{
254
168
type Visitor = BufVisitor < Self > ;
255
169
256
- fn deserialize_octets < D : serde:: Deserializer < ' de > > (
257
- deserializer : D ,
258
- ) -> Result < Self , D :: Error > {
259
- Self :: visitor ( ) . deserialize ( deserializer)
260
- }
261
-
262
170
fn deserialize_with_visitor < D , V > (
263
171
deserializer : D ,
264
172
visitor : V ,
@@ -279,12 +187,6 @@ where
279
187
impl < ' de , const N : usize > DeserializeOctets < ' de > for heapless:: Vec < u8 , N > {
280
188
type Visitor = HeaplessVecVisitor < N > ;
281
189
282
- fn deserialize_octets < D : serde:: Deserializer < ' de > > (
283
- deserializer : D ,
284
- ) -> Result < Self , D :: Error > {
285
- Self :: visitor ( ) . deserialize ( deserializer)
286
- }
287
-
288
190
fn deserialize_with_visitor < D , V > (
289
191
deserializer : D ,
290
192
visitor : V ,
@@ -309,16 +211,6 @@ impl<T> BorrowedVisitor<T> {
309
211
fn new ( ) -> Self {
310
212
BorrowedVisitor ( PhantomData )
311
213
}
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
- }
322
214
}
323
215
324
216
impl < ' de , T > serde:: de:: Visitor < ' de > for BorrowedVisitor < T >
@@ -349,16 +241,6 @@ impl<T> BufVisitor<T> {
349
241
fn new ( ) -> Self {
350
242
BufVisitor ( PhantomData )
351
243
}
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
- }
362
244
}
363
245
364
246
#[ cfg( feature = "std" ) ]
@@ -387,7 +269,6 @@ where
387
269
}
388
270
}
389
271
390
-
391
272
//------------ HeaplessVisitor -----------------------------------------------
392
273
393
274
#[ cfg( feature = "heapless" ) ]
@@ -398,13 +279,6 @@ impl<const N: usize> HeaplessVecVisitor<N> {
398
279
fn new ( ) -> Self {
399
280
Self
400
281
}
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
- }
408
282
}
409
283
410
284
#[ cfg( feature = "heapless" ) ]
0 commit comments