Skip to main content

rw_builder/
vec.rs

1use std::{cell::RefCell, cmp::min, rc::Rc};
2
3use crate::Result;
4
5use crate::RwBuilder;
6
7/// Type for building readers and writers on top of a `Vec` in memory.
8/// It is itself an `RwBuilder`, but can't be created through one.
9/// This is why we call it a source.
10#[derive(Debug, Default)]
11#[must_use]
12pub struct Builder {
13    /// The inner `Vec` which is used to write data to and read data from
14    /// It is shared between the reader and the writer
15    buffer: Rc<RefCell<Vec<u8>>>,
16}
17
18impl RwBuilder for Builder {
19    type Reader = Reader;
20    type Writer = Writer;
21
22    fn reader(&self) -> Result<Self::Reader> {
23        Ok(Reader { buffer: Rc::clone(&self.buffer), bytes_read: 0 })
24    }
25
26    fn writer(&self) -> Result<Self::Writer> {
27        Ok(Writer { buffer: Rc::clone(&self.buffer) })
28    }
29}
30
31/// Reading from a `Vec`
32#[derive(Debug)]
33pub struct Reader {
34    /// The buffer shared between the builder, reader and writer
35    buffer: Rc<RefCell<Vec<u8>>>,
36    /// The read position in the buffer
37    bytes_read: usize,
38}
39
40impl std::io::Read for Reader {
41    fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
42        let borrowed = self.buffer.borrow();
43        let byte_count = min(borrowed.len() - self.bytes_read, buf.len());
44        buf[..byte_count].copy_from_slice(&borrowed[self.bytes_read..self.bytes_read + byte_count]);
45        self.bytes_read += byte_count;
46        Ok(byte_count)
47    }
48}
49
50impl std::io::Write for Writer {
51    fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
52        let mut borrowed = self.buffer.borrow_mut();
53        let byte_count = buf.len();
54        borrowed.extend_from_slice(buf);
55        Ok(byte_count)
56    }
57
58    fn flush(&mut self) -> std::io::Result<()> {
59        Ok(())
60    }
61}
62
63/// Writing to a `Vec`
64#[derive(Debug)]
65pub struct Writer {
66    /// The buffer shared between the builder, reader and writer
67    buffer: Rc<RefCell<Vec<u8>>>,
68}