@@ -39,14 +39,6 @@ use core::convert::Infallible;
39
39
/// octet slices via their implementations of `AsRef<[u8]>` and
40
40
/// `AsMut<[u8]>`.
41
41
pub trait OctetsBuilder {
42
- /// The type of the octets the builder can be converted into.
43
- ///
44
- /// If `Octets` implements [`IntoBuilder`], the `Builder` associated
45
- /// type of that trait must be `Self`.
46
- ///
47
- /// [`IntoBuilder`]: trait.IntoBuilder.html
48
- type Octets : AsRef < [ u8 ] > ;
49
-
50
42
/// The error type when appending data fails.
51
43
///
52
44
/// There are exactly two options for this type: Builders where appending
@@ -67,15 +59,10 @@ pub trait OctetsBuilder {
67
59
fn append_slice (
68
60
& mut self , slice : & [ u8 ]
69
61
) -> Result < ( ) , Self :: AppendError > ;
70
-
71
- /// Converts the builder into immutable octets.
72
- fn freeze ( self ) -> Self :: Octets
73
- where Self : Sized ;
74
62
}
75
63
76
64
#[ cfg( feature = "std" ) ]
77
65
impl OctetsBuilder for Vec < u8 > {
78
- type Octets = Self ;
79
66
type AppendError = Infallible ;
80
67
81
68
fn append_slice (
@@ -84,15 +71,10 @@ impl OctetsBuilder for Vec<u8> {
84
71
self . extend_from_slice ( slice) ;
85
72
Ok ( ( ) )
86
73
}
87
-
88
- fn freeze ( self ) -> Self :: Octets {
89
- self
90
- }
91
74
}
92
75
93
76
#[ cfg( feature = "std" ) ]
94
77
impl < ' a > OctetsBuilder for Cow < ' a , [ u8 ] > {
95
- type Octets = Self ;
96
78
type AppendError = Infallible ;
97
79
98
80
fn append_slice (
@@ -109,15 +91,10 @@ impl<'a> OctetsBuilder for Cow<'a, [u8]> {
109
91
}
110
92
Ok ( ( ) )
111
93
}
112
-
113
- fn freeze ( self ) -> Self :: Octets {
114
- self
115
- }
116
94
}
117
95
118
96
#[ cfg( feature = "bytes" ) ]
119
97
impl OctetsBuilder for BytesMut {
120
- type Octets = Bytes ;
121
98
type AppendError = Infallible ;
122
99
123
100
fn append_slice (
@@ -126,15 +103,10 @@ impl OctetsBuilder for BytesMut {
126
103
self . extend_from_slice ( slice) ;
127
104
Ok ( ( ) )
128
105
}
129
-
130
- fn freeze ( self ) -> Self :: Octets {
131
- self . freeze ( )
132
- }
133
106
}
134
107
135
108
#[ cfg( feature = "smallvec" ) ]
136
109
impl < A : smallvec:: Array < Item = u8 > > OctetsBuilder for smallvec:: SmallVec < A > {
137
- type Octets = Self ;
138
110
type AppendError = Infallible ;
139
111
140
112
fn append_slice (
@@ -143,26 +115,17 @@ impl<A: smallvec::Array<Item = u8>> OctetsBuilder for smallvec::SmallVec<A> {
143
115
self . extend_from_slice ( slice) ;
144
116
Ok ( ( ) )
145
117
}
146
-
147
- fn freeze ( self ) -> Self :: Octets {
148
- self
149
- }
150
118
}
151
119
152
120
#[ cfg( feature = "heapless" ) ]
153
121
impl < const N : usize > OctetsBuilder for heapless:: Vec < u8 , N > {
154
- type Octets = Self ;
155
122
type AppendError = ShortBuf ;
156
123
157
124
fn append_slice (
158
125
& mut self , slice : & [ u8 ]
159
126
) -> Result < ( ) , Self :: AppendError > {
160
127
self . extend_from_slice ( slice) . map_err ( |_| ShortBuf )
161
128
}
162
-
163
- fn freeze ( self ) -> Self :: Octets {
164
- self
165
- }
166
129
}
167
130
168
131
@@ -292,6 +255,64 @@ impl<const N: usize> EmptyBuilder for heapless::Vec<u8, N> {
292
255
}
293
256
}
294
257
258
+
259
+ //------------ FreezeBuilder -------------------------------------------------
260
+
261
+ /// An octets builder that can be frozen into a imutable octets sequence.
262
+ pub trait FreezeBuilder {
263
+ /// The type of octets sequence to builder will be frozen into.
264
+ type Octets ;
265
+
266
+ /// Converts the octets builder into an imutable octets sequence.
267
+ fn freeze ( self ) -> Self :: Octets ;
268
+ }
269
+
270
+ #[ cfg( feature = "std" ) ]
271
+ impl FreezeBuilder for Vec < u8 > {
272
+ type Octets = Self ;
273
+
274
+ fn freeze ( self ) -> Self :: Octets {
275
+ self
276
+ }
277
+ }
278
+
279
+ #[ cfg( feature = "std" ) ]
280
+ impl < ' a > FreezeBuilder for Cow < ' a , [ u8 ] > {
281
+ type Octets = Self ;
282
+
283
+ fn freeze ( self ) -> Self :: Octets {
284
+ self
285
+ }
286
+ }
287
+
288
+ #[ cfg( feature = "bytes" ) ]
289
+ impl FreezeBuilder for BytesMut {
290
+ type Octets = Bytes ;
291
+
292
+ fn freeze ( self ) -> Self :: Octets {
293
+ BytesMut :: freeze ( self )
294
+ }
295
+ }
296
+
297
+ #[ cfg( feature = "smallvec" ) ]
298
+ impl < A : smallvec:: Array < Item = u8 > > FreezeBuilder for smallvec:: SmallVec < A > {
299
+ type Octets = Self ;
300
+
301
+ fn freeze ( self ) -> Self :: Octets {
302
+ self
303
+ }
304
+ }
305
+
306
+ #[ cfg( feature = "heapless" ) ]
307
+ impl < const N : usize > FreezeBuilder for heapless:: Vec < u8 , N > {
308
+ type Octets = Self ;
309
+
310
+ fn freeze ( self ) -> Self :: Octets {
311
+ self
312
+ }
313
+ }
314
+
315
+
295
316
//------------ IntoBuilder ---------------------------------------------------
296
317
297
318
/// An octets type that can be converted into an octets builder.
@@ -366,7 +387,7 @@ impl<const N: usize> IntoBuilder for heapless::Vec<u8, N> {
366
387
/// An octets type that can be created from an octets builder.
367
388
pub trait FromBuilder : AsRef < [ u8 ] > + Sized {
368
389
/// The type of builder this octets type can be created from.
369
- type Builder : OctetsBuilder < Octets = Self > ;
390
+ type Builder : OctetsBuilder + FreezeBuilder < Octets = Self > ;
370
391
371
392
/// Creates an octets value from an octets builder.
372
393
fn from_builder ( builder : Self :: Builder ) -> Self ;
@@ -433,7 +454,7 @@ impl<const N: usize> FromBuilder for heapless::Vec<u8, N> {
433
454
pub struct ShortBuf ;
434
455
435
456
436
- //--- From and CollapseResult
457
+ //--- From
437
458
438
459
impl From < Infallible > for ShortBuf {
439
460
fn from ( _: Infallible ) -> ShortBuf {
0 commit comments