use crate::{ import::*, Dictator };
#[ derive( Debug ) ]
pub struct Sketchy<T>
{
inner: T ,
bd : Dictator ,
}
impl<T> Sketchy<T>
{
pub fn new( inner: T, seed: u64 ) -> Self
{
Self
{
inner,
bd: Dictator::new( seed )
}
}
}
impl<T> AsyncRead for Sketchy<T>
where T: AsyncRead + Unpin
{
fn poll_read( mut self: Pin<&mut Self>, cx: &mut Context<'_>, buf: &mut [u8] ) -> Poll< Result<usize, io::Error> >
{
if self.bd.please( "AsyncRead::poll_read - return Pending?", 0.3 )
{
cx.waker().wake_by_ref();
return Poll::Pending;
}
if buf.len() > 1 && self.bd.please( "AsyncRead::poll_read - return Partial?", 0.5 )
{
let size = self.bd.pick( "AsyncRead::poll_read - buffer size", 1..buf.len() );
return Pin::new( &mut self.inner ).poll_read( cx, &mut buf[0..size] )
}
Pin::new( &mut self.inner ).poll_read( cx, buf )
}
}
impl<T> AsyncWrite for Sketchy<T> where T: AsyncWrite + Unpin
{
fn poll_write( mut self: Pin<&mut Self>, cx: &mut Context<'_>, buf: &[u8] ) -> Poll< io::Result<usize> >
{
if self.bd.please( "AsyncWrite::poll_write - return Pending?", 0.3 )
{
cx.waker().wake_by_ref();
return Poll::Pending;
}
if buf.len() > 1 && self.bd.please( "AsyncWrite::poll_write - return Partial?", 0.5 )
{
let size = self.bd.pick( "AsyncWrite::poll_write - buffer size", 1..buf.len() );
return Pin::new( &mut self.inner ).poll_write( cx, &buf[0..size] )
}
Pin::new( &mut self.inner ).poll_write( cx, buf )
}
fn poll_flush(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll< io::Result<()> >
{
if self.bd.please( "AsyncWrite::poll_flush - return Pending?", 0.5 )
{
cx.waker().wake_by_ref();
return Poll::Pending;
}
Pin::new( &mut self.inner ).poll_flush( cx )
}
fn poll_close( mut self: Pin<&mut Self>, cx: &mut Context<'_> ) -> Poll< io::Result<()> >
{
if self.bd.please( "AsyncWrite::poll_close - return Pending?", 0.5 )
{
cx.waker().wake_by_ref();
return Poll::Pending;
}
Pin::new( &mut self.inner ).poll_close( cx )
}
}