mid_net/
ext.rs

1use tokio::{
2    io::{
3        AsyncReadExt,
4        AsyncWriteExt,
5        BufReader,
6    },
7    net::{
8        tcp::{
9            ReadHalf,
10            WriteHalf,
11        },
12        TcpStream,
13    },
14};
15
16use crate::{
17    reader::MidReader,
18    writer::MidWriter,
19};
20
21pub trait ReaderUnderlyingExt: AsyncReadExt + Unpin {}
22pub trait WriterUnderlyingExt: AsyncWriteExt + Unpin {}
23
24impl<T: AsyncReadExt + Unpin> ReaderUnderlyingExt for T {}
25impl<T: AsyncWriteExt + Unpin> WriterUnderlyingExt for T {}
26
27pub trait MidStreamExt {
28    /// Create `Middleware` rw handles from the
29    /// [`TcpStream`]
30    fn as_rw_handles<C, D>(
31        &mut self,
32        compressor: C,
33        decompressor: D,
34    ) -> (MidReader<ReadHalf<'_>, D>, MidWriter<WriteHalf<'_>, C>);
35
36    /// Create `Middleware` rw handles with the buffered
37    /// reader
38    fn as_buffered_rw_handles<C, D>(
39        &mut self,
40        compressor: C,
41        decompressor: D,
42        buffer_size: usize,
43    ) -> (
44        MidReader<BufReader<ReadHalf<'_>>, D>,
45        MidWriter<WriteHalf<'_>, C>,
46    );
47}
48
49impl MidStreamExt for TcpStream {
50    fn as_rw_handles<C, D>(
51        &mut self,
52        compressor: C,
53        decompressor: D,
54    ) -> (MidReader<ReadHalf<'_>, D>, MidWriter<WriteHalf<'_>, C>) {
55        let (read, write) = self.split();
56        (
57            MidReader::new(read, decompressor),
58            MidWriter::new(write, compressor),
59        )
60    }
61
62    fn as_buffered_rw_handles<C, D>(
63        &mut self,
64        compressor: C,
65        decompressor: D,
66        buffer_size: usize,
67    ) -> (
68        MidReader<BufReader<ReadHalf<'_>>, D>,
69        MidWriter<WriteHalf<'_>, C>,
70    ) {
71        let (read, write) = self.split();
72        (
73            MidReader::new_buffered(read, decompressor, buffer_size),
74            MidWriter::new(write, compressor),
75        )
76    }
77}