use crate::{Activity, Bufferable, Status};
use std::io::{self, IoSlice};
use std::ops::DerefMut;
use std::pin::Pin;
use std::task::{Context, Poll};
use tokio::io::AsyncWrite;
pub trait TokioWriteLayered: AsyncWrite + Bufferable {
fn flush_with_status(
self: Pin<&mut Self>,
cx: &mut Context<'_>,
status: Status,
) -> Poll<io::Result<()>> {
match status {
Status::Open(Activity::Active) => Poll::Ready(Ok(())),
Status::Open(Activity::Push) => AsyncWrite::poll_flush(self, cx),
Status::End => AsyncWrite::poll_shutdown(self, cx),
}
}
}
pub fn tokio_default_poll_write_vectored<Inner: AsyncWrite + ?Sized>(
inner: Pin<&mut Inner>,
cx: &mut Context<'_>,
bufs: &[IoSlice<'_>],
) -> Poll<io::Result<usize>> {
let buf = bufs
.iter()
.find(|b| !b.is_empty())
.map_or(&[][..], |b| &**b);
AsyncWrite::poll_write(inner, cx, buf)
}
impl<W: TokioWriteLayered + Unpin> TokioWriteLayered for Box<W> {}
impl<W: TokioWriteLayered + Unpin> TokioWriteLayered for &mut W {}
impl<P> TokioWriteLayered for Pin<P>
where
P: DerefMut + Unpin,
P::Target: TokioWriteLayered + Unpin,
{
}