use futures::{AsyncRead, AsyncWrite}; use libp2p_core::muxing::SubstreamBox; use libp2p_core::Negotiated; use std::io::{IoSlice, IoSliceMut}; use std::pin::Pin; use std::task::{Context, Poll}; #[derive(Debug)] pub struct Stream(Negotiated); impl Stream { pub(crate) fn new(stream: Negotiated) -> Self { Self(stream) } } impl AsyncRead for Stream { fn poll_read( self: Pin<&mut Self>, cx: &mut Context<'_>, buf: &mut [u8], ) -> Poll> { Pin::new(&mut self.get_mut().0).poll_read(cx, buf) } fn poll_read_vectored( self: Pin<&mut Self>, cx: &mut Context<'_>, bufs: &mut [IoSliceMut<'_>], ) -> Poll> { Pin::new(&mut self.get_mut().0).poll_read_vectored(cx, bufs) } } impl AsyncWrite for Stream { fn poll_write( self: Pin<&mut Self>, cx: &mut Context<'_>, buf: &[u8], ) -> Poll> { Pin::new(&mut self.get_mut().0).poll_write(cx, buf) } fn poll_write_vectored( self: Pin<&mut Self>, cx: &mut Context<'_>, bufs: &[IoSlice<'_>], ) -> Poll> { Pin::new(&mut self.get_mut().0).poll_write_vectored(cx, bufs) } fn poll_flush(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { Pin::new(&mut self.get_mut().0).poll_flush(cx) } fn poll_close(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { Pin::new(&mut self.get_mut().0).poll_close(cx) } }