Skip to main content

shuck_format/
buffer.rs

1use crate::format_element::FormatElement;
2
3pub trait Buffer {
4    fn write_element(&mut self, element: FormatElement);
5
6    fn write_elements<I>(&mut self, elements: I)
7    where
8        I: IntoIterator<Item = FormatElement>,
9    {
10        for element in elements {
11            self.write_element(element);
12        }
13    }
14
15    fn elements(&self) -> &[FormatElement];
16}
17
18#[derive(Debug, Clone, Default, PartialEq, Eq)]
19pub struct VecBuffer {
20    elements: Vec<FormatElement>,
21}
22
23impl VecBuffer {
24    #[must_use]
25    pub fn new() -> Self {
26        Self::default()
27    }
28
29    #[must_use]
30    pub fn with_capacity(capacity: usize) -> Self {
31        Self {
32            elements: Vec::with_capacity(capacity),
33        }
34    }
35
36    #[must_use]
37    pub fn as_slice(&self) -> &[FormatElement] {
38        &self.elements
39    }
40
41    #[must_use]
42    pub fn into_vec(self) -> Vec<FormatElement> {
43        self.elements
44    }
45}
46
47impl Buffer for VecBuffer {
48    fn write_element(&mut self, element: FormatElement) {
49        self.elements.push(element);
50    }
51
52    fn elements(&self) -> &[FormatElement] {
53        self.as_slice()
54    }
55}