use std::io::Write;
use futures::AsyncWriteExt;
use crate::*;
pub struct StdWriter {
handle: tokio::runtime::Handle,
w: Option<FuturesAsyncWriter>,
}
impl StdWriter {
#[inline]
pub(crate) fn new(handle: tokio::runtime::Handle, w: Writer) -> Self {
StdWriter {
handle,
w: Some(w.into_futures_async_write()),
}
}
pub fn close(&mut self) -> std::io::Result<()> {
let Some(w) = self.w.as_mut() else {
return Err(Error::new(ErrorKind::Unexpected, "writer has been dropped").into());
};
self.handle.block_on(w.close())
}
}
impl Write for StdWriter {
fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
let Some(w) = self.w.as_mut() else {
return Err(Error::new(ErrorKind::Unexpected, "writer has been dropped").into());
};
self.handle.block_on(w.write(buf))
}
fn flush(&mut self) -> std::io::Result<()> {
let Some(w) = self.w.as_mut() else {
return Err(Error::new(ErrorKind::Unexpected, "writer has been dropped").into());
};
self.handle.block_on(w.flush())
}
}
impl Drop for StdWriter {
fn drop(&mut self) {
if let Some(v) = self.w.take() {
self.handle.block_on(async move { drop(v) });
}
}
}