use std::future::Future;
use crate::raw::*;
use crate::*;
pub trait OneShotWrite: Send + Sync + Unpin + 'static {
fn write_once(&self, bs: Buffer) -> impl Future<Output = Result<Metadata>> + MaybeSend;
}
pub struct OneShotWriter<W: OneShotWrite> {
inner: W,
buffer: Option<Buffer>,
}
impl<W: OneShotWrite> OneShotWriter<W> {
pub fn new(inner: W) -> Self {
Self {
inner,
buffer: None,
}
}
}
impl<W: OneShotWrite> oio::Write for OneShotWriter<W> {
async fn write(&mut self, bs: Buffer) -> Result<()> {
match &self.buffer {
Some(_) => Err(Error::new(
ErrorKind::Unsupported,
"OneShotWriter doesn't support multiple write",
)),
None => {
self.buffer = Some(bs);
Ok(())
}
}
}
async fn close(&mut self) -> Result<Metadata> {
match self.buffer.clone() {
Some(bs) => self.inner.write_once(bs).await,
None => self.inner.write_once(Buffer::new()).await,
}
}
async fn abort(&mut self) -> Result<()> {
self.buffer = None;
Ok(())
}
}