1use std::{cell::RefCell, cmp::min, rc::Rc};
2
3use crate::Result;
4
5use crate::RwBuilder;
6
7#[derive(Debug, Default)]
11#[must_use]
12pub struct Builder {
13 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#[derive(Debug)]
33pub struct Reader {
34 buffer: Rc<RefCell<Vec<u8>>>,
36 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#[derive(Debug)]
65pub struct Writer {
66 buffer: Rc<RefCell<Vec<u8>>>,
68}