use super::std_writer::StdWriter;
use crate::Writer as AsyncWriter;
use crate::*;
pub struct Writer {
handle: tokio::runtime::Handle,
inner: Option<AsyncWriter>,
}
impl Writer {
pub(crate) fn new(handle: tokio::runtime::Handle, inner: AsyncWriter) -> Self {
Self {
handle,
inner: Some(inner),
}
}
pub fn write(&mut self, bs: impl Into<Buffer>) -> Result<()> {
let Some(inner) = self.inner.as_mut() else {
return Err(Error::new(ErrorKind::Unexpected, "writer has been dropped"));
};
self.handle.block_on(inner.write(bs))
}
pub fn close(&mut self) -> Result<Metadata> {
let Some(inner) = self.inner.as_mut() else {
return Err(Error::new(ErrorKind::Unexpected, "writer has been dropped"));
};
self.handle.block_on(inner.close())
}
pub fn into_std_write(mut self) -> StdWriter {
let inner = self
.inner
.take()
.ok_or_else(|| Error::new(ErrorKind::Unexpected, "writer has been dropped"))
.expect("writer has been dropped");
StdWriter::new(self.handle.clone(), inner)
}
}
impl Drop for Writer {
fn drop(&mut self) {
if let Some(v) = self.inner.take() {
self.handle.block_on(async move { drop(v) });
}
}
}