Skip to content

Commit a2fe1dd

Browse files
authored
Split FreezeBuilder out of OctetsBuilder. (#25)
1 parent b5fbd38 commit a2fe1dd

File tree

3 files changed

+75
-49
lines changed

3 files changed

+75
-49
lines changed

src/array.rs

+11-8
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11

22
use core::{cmp, fmt};
33
use crate::builder::{
4-
EmptyBuilder, FromBuilder, IntoBuilder, OctetsBuilder, ShortBuf,
5-
Truncate,
4+
EmptyBuilder, FreezeBuilder, FromBuilder, IntoBuilder, OctetsBuilder,
5+
ShortBuf, Truncate,
66
};
77
use crate::octets::OctetsFrom;
88

@@ -115,10 +115,9 @@ impl<const N: usize> Truncate for Array<N> {
115115
}
116116

117117

118-
//--- OctetsBuilder and EmptyBuilder
118+
//--- OctetsBuilder, EmptyBuilder, and FreezeBuilder
119119

120120
impl<const N: usize> OctetsBuilder for Array<N> {
121-
type Octets = Self;
122121
type AppendError = ShortBuf;
123122

124123
fn append_slice(
@@ -132,10 +131,6 @@ impl<const N: usize> OctetsBuilder for Array<N> {
132131
self.len = end;
133132
Ok(())
134133
}
135-
136-
fn freeze(self) -> Self::Octets {
137-
self
138-
}
139134
}
140135

141136
impl<const N: usize> EmptyBuilder for Array<N> {
@@ -148,6 +143,14 @@ impl<const N: usize> EmptyBuilder for Array<N> {
148143
}
149144
}
150145

146+
impl<const N: usize> FreezeBuilder for Array<N> {
147+
type Octets = Self;
148+
149+
fn freeze(self) -> Self::Octets {
150+
self
151+
}
152+
}
153+
151154

152155
//--- IntoBuilder, FromBuilder
153156

src/builder.rs

+60-39
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,6 @@ use core::convert::Infallible;
3939
/// octet slices via their implementations of `AsRef<[u8]>` and
4040
/// `AsMut<[u8]>`.
4141
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-
5042
/// The error type when appending data fails.
5143
///
5244
/// There are exactly two options for this type: Builders where appending
@@ -67,15 +59,10 @@ pub trait OctetsBuilder {
6759
fn append_slice(
6860
&mut self, slice: &[u8]
6961
) -> Result<(), Self::AppendError>;
70-
71-
/// Converts the builder into immutable octets.
72-
fn freeze(self) -> Self::Octets
73-
where Self: Sized;
7462
}
7563

7664
#[cfg(feature = "std")]
7765
impl OctetsBuilder for Vec<u8> {
78-
type Octets = Self;
7966
type AppendError = Infallible;
8067

8168
fn append_slice(
@@ -84,15 +71,10 @@ impl OctetsBuilder for Vec<u8> {
8471
self.extend_from_slice(slice);
8572
Ok(())
8673
}
87-
88-
fn freeze(self) -> Self::Octets {
89-
self
90-
}
9174
}
9275

9376
#[cfg(feature = "std")]
9477
impl<'a> OctetsBuilder for Cow<'a, [u8]> {
95-
type Octets = Self;
9678
type AppendError = Infallible;
9779

9880
fn append_slice(
@@ -109,15 +91,10 @@ impl<'a> OctetsBuilder for Cow<'a, [u8]> {
10991
}
11092
Ok(())
11193
}
112-
113-
fn freeze(self) -> Self::Octets {
114-
self
115-
}
11694
}
11795

11896
#[cfg(feature = "bytes")]
11997
impl OctetsBuilder for BytesMut {
120-
type Octets = Bytes;
12198
type AppendError = Infallible;
12299

123100
fn append_slice(
@@ -126,15 +103,10 @@ impl OctetsBuilder for BytesMut {
126103
self.extend_from_slice(slice);
127104
Ok(())
128105
}
129-
130-
fn freeze(self) -> Self::Octets {
131-
self.freeze()
132-
}
133106
}
134107

135108
#[cfg(feature = "smallvec")]
136109
impl<A: smallvec::Array<Item = u8>> OctetsBuilder for smallvec::SmallVec<A> {
137-
type Octets = Self;
138110
type AppendError = Infallible;
139111

140112
fn append_slice(
@@ -143,26 +115,17 @@ impl<A: smallvec::Array<Item = u8>> OctetsBuilder for smallvec::SmallVec<A> {
143115
self.extend_from_slice(slice);
144116
Ok(())
145117
}
146-
147-
fn freeze(self) -> Self::Octets {
148-
self
149-
}
150118
}
151119

152120
#[cfg(feature = "heapless")]
153121
impl<const N: usize> OctetsBuilder for heapless::Vec<u8, N> {
154-
type Octets = Self;
155122
type AppendError = ShortBuf;
156123

157124
fn append_slice(
158125
&mut self, slice: &[u8]
159126
) -> Result<(), Self::AppendError> {
160127
self.extend_from_slice(slice).map_err(|_| ShortBuf)
161128
}
162-
163-
fn freeze(self) -> Self::Octets {
164-
self
165-
}
166129
}
167130

168131

@@ -292,6 +255,64 @@ impl<const N: usize> EmptyBuilder for heapless::Vec<u8, N> {
292255
}
293256
}
294257

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+
295316
//------------ IntoBuilder ---------------------------------------------------
296317

297318
/// 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> {
366387
/// An octets type that can be created from an octets builder.
367388
pub trait FromBuilder: AsRef<[u8]> + Sized {
368389
/// The type of builder this octets type can be created from.
369-
type Builder: OctetsBuilder<Octets = Self>;
390+
type Builder: OctetsBuilder + FreezeBuilder<Octets = Self>;
370391

371392
/// Creates an octets value from an octets builder.
372393
fn from_builder(builder: Self::Builder) -> Self;
@@ -433,7 +454,7 @@ impl<const N: usize> FromBuilder for heapless::Vec<u8, N> {
433454
pub struct ShortBuf;
434455

435456

436-
//--- From and CollapseResult
457+
//--- From
437458

438459
impl From<Infallible> for ShortBuf {
439460
fn from(_: Infallible) -> ShortBuf {

src/str.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77
88
use core::{borrow, cmp, fmt, hash, ops, str};
99
use core::convert::Infallible;
10-
use crate::builder::{EmptyBuilder, OctetsBuilder, Truncate, infallible};
10+
use crate::builder::{
11+
EmptyBuilder, FreezeBuilder, OctetsBuilder, Truncate, infallible
12+
};
1113

1214

1315
//------------ Str -----------------------------------------------------------
@@ -309,7 +311,7 @@ impl<Octets> StrBuilder<Octets> {
309311

310312
/// Converts the string builder into the final str.
311313
pub fn freeze(self) -> Str<Octets::Octets>
312-
where Octets: OctetsBuilder {
314+
where Octets: FreezeBuilder {
313315
Str(self.0.freeze())
314316
}
315317

0 commit comments

Comments
 (0)