1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
//! Dynamically build a Bytes object.

/// Fast Byte Buffer
///
/// Puff's `BytesBuilder` type uses [std::vec::Vec] under the hood. `Vec`s are not
/// sharable structures and so need to be wrapped in an Arc to be shared between threads and cheaply copied.
/// You should use a `BytesBuilder` and convert it into `Bytes` when you are done writing to it.
///
/// # Examples
///
/// ```
/// use puff_rs::types::BytesBuilder;
///
/// let mut builder = BytesBuilder::new();
/// builder.put("hello_world");
/// let bytes = builder.into_bytes();
/// ```
///
pub struct BytesBuilder(Vec<u8>);
use crate::types::Bytes;

impl BytesBuilder {
    /// Creates an empty `BytesBuilder`.
    ///
    /// The hash map is initially created with a capacity of 0, so it will not allocate until it
    /// is first inserted into.
    ///
    /// # Examples
    ///
    /// ```
    /// use puff_rs::types::{Text, BytesBuilder};
    /// let mut builder = BytesBuilder::new();
    /// ```
    pub fn new() -> Self {
        Self(Vec::new())
    }

    /// Creates an empty `BytesBuilder` with the specified capacity.
    ///
    /// The buffer will be able to hold at least `capacity` elements without
    /// reallocating. If `capacity` is 0, the hash map will not allocate.
    ///
    /// # Examples
    ///
    /// ```
    /// use puff_rs::types::BytesBuilder;
    /// let mut builder = BytesBuilder::with_capacity(10);
    /// ```
    pub fn with_capacity(capacity: usize) -> Self {
        Self(Vec::with_capacity(capacity))
    }

    /// Puts some bytes into the builder.
    ///
    /// # Examples
    ///
    /// ```
    /// use puff_rs::types::BytesBuilder;
    /// let mut builder = BytesBuilder::new();
    /// builder.put("Hi");
    /// ```
    pub fn put<T: Into<Bytes>>(&mut self, slice: T) {
        self.0.extend_from_slice(slice.into().as_ref())
    }

    /// Puts a slice into the builder.
    ///
    /// # Examples
    ///
    /// ```
    /// use puff_rs::types::BytesBuilder;
    /// let mut builder = BytesBuilder::new();
    /// builder.put_slice("Hi".as_bytes());
    /// ```
    pub fn put_slice(&mut self, slice: &[u8]) {
        self.0.extend_from_slice(slice)
    }

    /// Converts `BytesBuilder` into `Bytes`.
    pub fn into_bytes(self) -> Bytes {
        Bytes::from(self.0)
    }
}