embytes_buffer_async/
pipe.rs

1use crate::{AsyncBuffer, BufferReader, BufferWriter};
2
3pub struct ReadPipe<'a, 'b, const C: usize, T: AsRef<[u8]> + AsMut<[u8]>, S: embedded_io_async::Read> {
4    source: &'a mut S,
5    target: BufferWriter<'b, C, T>
6}
7
8impl <'a, 'b, const C: usize, T: AsRef<[u8]> + AsMut<[u8]>, S: embedded_io_async::Read> ReadPipe<'a, 'b, C, T, S> {
9
10    pub fn new(source: &'a mut S, buffer: &'b AsyncBuffer<C, T>) -> Self {
11        Self {
12            source: source,
13            target: buffer.create_writer()
14        }
15    }
16
17    pub async fn run(&mut self) -> Result<(), S::Error> {
18        use embedded_io_async::Write;
19
20        let mut buf = [0; 64];
21        loop {
22            let n = self.source.read(&mut buf).await?;
23            self.target.write_all(&buf[..n]).await.unwrap();
24        }
25    }
26}
27
28pub struct WritePipe<'a, 'b, const C: usize, T: AsRef<[u8]> + AsMut<[u8]>, S: embedded_io_async::Write> {
29    target: &'a mut S,
30    source: BufferReader<'b, C, T>
31}
32
33impl <'a, 'b, const C: usize, T: AsRef<[u8]> + AsMut<[u8]>, S: embedded_io_async::Write> WritePipe<'a, 'b, C, T, S> {
34
35    pub fn new(target: &'a mut S, buffer: &'b AsyncBuffer<C, T>) -> Self {
36        Self {
37            target: target,
38            source: buffer.create_reader()
39        }
40    }
41
42    pub async fn run(&mut self) -> Result<(), S::Error> {
43        use embedded_io_async::Read;
44
45        let mut buf = [0; 64];
46        loop {
47            let n = self.source.read(&mut buf).await.unwrap();
48            self.target.write_all(&buf[..n]).await?;
49        }
50    }
51}