use crate::{ import::*, RingBuffer };
#[ derive( Debug ) ]
pub struct Endpoint
{
writer: WriteHalf< RingBuffer<u8> >,
reader: ReadHalf < RingBuffer<u8> >,
}
impl Endpoint
{
pub fn pair( a_buf: usize, b_buf: usize ) -> (Endpoint, Endpoint)
{
let ab_buf = RingBuffer::<u8>::new( a_buf );
let ba_buf = RingBuffer::<u8>::new( b_buf );
let (ab_reader, ab_writer) = ab_buf.split();
let (ba_reader, ba_writer) = ba_buf.split();
(
Endpoint{ writer: ab_writer, reader: ba_reader },
Endpoint{ writer: ba_writer, reader: ab_reader },
)
}
}
impl AsyncRead for Endpoint
{
fn poll_read( mut self: Pin<&mut Self>, cx: &mut Context<'_>, buf: &mut [u8] ) -> Poll< io::Result<usize> >
{
let poll = Pin::new(&mut self.reader).poll_read(cx, buf);
log::trace!("poll_read() => {:?}", poll);
poll
}
}
impl AsyncWrite for Endpoint
{
fn poll_write( mut self: Pin<&mut Self>, cx: &mut Context<'_>, buf: &[u8] ) -> Poll< io::Result<usize> >
{
let poll = Pin::new(&mut self.writer).poll_write(cx, buf);
log::trace!("poll_write() => {:?}", poll);
poll
}
fn poll_flush(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll< io::Result<()> >
{
let poll = Pin::new(&mut self.writer).poll_flush(cx);
log::trace!("poll_flush() => {:?}", poll);
poll
}
fn poll_close( mut self: Pin<&mut Self>, cx: &mut Context<'_> ) -> Poll< io::Result<()> >
{
let poll = Pin::new(&mut self.writer).poll_close(cx);
log::trace!("poll_close() => {:?}", poll);
poll
}
}
impl Drop for Endpoint
{
fn drop( &mut self )
{
let waker = noop_waker();
let mut cx = Context::from_waker( &waker );
let _ = Pin::new( self ).poll_close( &mut cx);
}
}