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 fn as_rw_handles<C, D>(
31 &mut self,
32 compressor: C,
33 decompressor: D,
34 ) -> (MidReader<ReadHalf<'_>, D>, MidWriter<WriteHalf<'_>, C>);
35
36 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}