1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
use futures_util::io::{AsyncRead, AsyncWrite}; use pin_project_lite::pin_project; use std::io::Error; use std::marker::Unpin; use std::ops::{Deref, DerefMut}; use std::pin::Pin; use std::task::{Context, Poll}; pin_project! { #[derive(Debug)] pub(crate) struct Fuse<T, U> { #[pin] pub t: T, pub u: U, } } impl<T, U> Fuse<T, U> { pub(crate) fn new(t: T, u: U) -> Self { Self { t, u } } } impl<T, U> Deref for Fuse<T, U> { type Target = T; fn deref(&self) -> &T { &self.t } } impl<T, U> DerefMut for Fuse<T, U> { fn deref_mut(&mut self) -> &mut T { &mut self.t } } impl<T: AsyncRead + Unpin, U> AsyncRead for Fuse<T, U> { fn poll_read( self: Pin<&mut Self>, cx: &mut Context<'_>, buf: &mut [u8], ) -> Poll<Result<usize, Error>> { self.project().t.poll_read(cx, buf) } } impl<T: AsyncWrite + Unpin, U> AsyncWrite for Fuse<T, U> { fn poll_write( self: Pin<&mut Self>, cx: &mut Context, buf: &[u8], ) -> Poll<Result<usize, Error>> { self.project().t.poll_write(cx, buf) } fn poll_flush(self: Pin<&mut Self>, cx: &mut Context) -> Poll<Result<(), Error>> { self.project().t.poll_flush(cx) } fn poll_close(self: Pin<&mut Self>, cx: &mut Context) -> Poll<Result<(), Error>> { self.project().t.poll_close(cx) } }