Skip to main content

compio_net/
split.rs

1use std::{io, ops::Deref};
2
3use compio_buf::{BufResult, IoBuf, IoBufMut, IoVectoredBuf, IoVectoredBufMut};
4use compio_io::{AsyncRead, AsyncWrite};
5
6pub(crate) fn split<'a, T>(stream: &'a T) -> (ReadHalf<'a, T>, WriteHalf<'a, T>)
7where
8    &'a T: AsyncRead + AsyncWrite,
9{
10    (ReadHalf(stream), WriteHalf(stream))
11}
12
13/// Borrowed read half.
14#[derive(Debug)]
15pub struct ReadHalf<'a, T>(&'a T);
16
17impl<'a, T> AsyncRead for ReadHalf<'a, T>
18where
19    &'a T: AsyncRead,
20{
21    async fn read<B: IoBufMut>(&mut self, buf: B) -> BufResult<usize, B> {
22        self.0.read(buf).await
23    }
24
25    async fn read_vectored<V: IoVectoredBufMut>(&mut self, buf: V) -> BufResult<usize, V> {
26        self.0.read_vectored(buf).await
27    }
28}
29
30impl<T> Deref for ReadHalf<'_, T> {
31    type Target = T;
32
33    fn deref(&self) -> &Self::Target {
34        self.0
35    }
36}
37
38/// Borrowed write half.
39#[derive(Debug)]
40pub struct WriteHalf<'a, T>(&'a T);
41
42impl<'a, T> AsyncWrite for WriteHalf<'a, T>
43where
44    &'a T: AsyncWrite,
45{
46    async fn write<B: IoBuf>(&mut self, buf: B) -> BufResult<usize, B> {
47        (self.0).write(buf).await
48    }
49
50    async fn write_vectored<B: IoVectoredBuf>(&mut self, buf: B) -> BufResult<usize, B> {
51        (self.0).write_vectored(buf).await
52    }
53
54    async fn flush(&mut self) -> io::Result<()> {
55        (self.0).flush().await
56    }
57
58    async fn shutdown(&mut self) -> io::Result<()> {
59        (self.0).shutdown().await
60    }
61}
62
63impl<T> Deref for WriteHalf<'_, T> {
64    type Target = T;
65
66    fn deref(&self) -> &Self::Target {
67        self.0
68    }
69}