use std::sync::Arc;
use super::core::*;
use crate::raw::oio;
use crate::raw::*;
use crate::*;
pub struct MemoryWriter {
core: Arc<MemoryCore>,
path: String,
op: OpWrite,
buf: Option<oio::QueueBuf>,
}
impl MemoryWriter {
pub fn new(core: Arc<MemoryCore>, path: String, op: OpWrite) -> Self {
Self {
core,
path,
op,
buf: None,
}
}
}
impl oio::Write for MemoryWriter {
async fn write(&mut self, bs: Buffer) -> Result<()> {
let mut buf = self.buf.take().unwrap_or_default();
buf.push(bs);
self.buf = Some(buf);
Ok(())
}
async fn close(&mut self) -> Result<Metadata> {
let buf = self.buf.take().unwrap_or_default();
let content = buf.collect();
let mut metadata = Metadata::new(EntryMode::FILE);
metadata.set_content_length(content.len() as u64);
if let Some(v) = self.op.cache_control() {
metadata.set_cache_control(v);
}
if let Some(v) = self.op.content_disposition() {
metadata.set_content_disposition(v);
}
if let Some(v) = self.op.content_type() {
metadata.set_content_type(v);
}
if let Some(v) = self.op.content_encoding() {
metadata.set_content_encoding(v);
}
let value = MemoryValue {
metadata: metadata.clone(),
content,
};
if self.op.if_not_exists() {
self.core.set_if_not_exists(&self.path, value)?;
} else {
self.core.set(&self.path, value)?;
}
Ok(metadata)
}
async fn abort(&mut self) -> Result<()> {
self.buf = None;
Ok(())
}
}