use crate::storage::bidi_write::stub::dynamic::AppendableObjectWriter as AppendableObjectWriterStub;
use bytes::Bytes;
#[derive(Debug)]
pub struct AppendableObjectWriter {
inner: Box<dyn AppendableObjectWriterStub>,
}
impl AppendableObjectWriter {
pub async fn append(&mut self, chunk: Bytes) -> crate::Result<()> {
self.inner.append(chunk).await
}
pub async fn flush(&mut self) -> crate::Result<i64> {
self.inner.flush().await
}
pub async fn finalize(self) -> crate::Result<crate::model::Object> {
self.inner.finalize().await
}
pub async fn close(self) -> crate::Result<i64> {
self.inner.close().await
}
pub fn generation(&self) -> i64 {
self.inner.generation()
}
pub fn persisted_size(&self) -> i64 {
self.inner.persisted_size()
}
pub fn new<T>(inner: T) -> Self
where
T: crate::stub::AppendableObjectWriter + 'static,
{
Self {
inner: Box::new(inner),
}
}
#[allow(dead_code)]
pub(crate) fn into_parts(self) -> Box<dyn AppendableObjectWriterStub> {
self.inner
}
}
#[cfg(test)]
mod tests {
use super::*;
use bytes::Bytes;
use mockall::mock;
#[tokio::test]
async fn test_appendable_object_writer_delegates() -> crate::Result<()> {
let mut mock = MockWriter::new();
mock.expect_append()
.with(mockall::predicate::eq(Bytes::from("test")))
.returning(|_| Ok(()));
mock.expect_flush().returning(|| Ok(123));
mock.expect_generation().returning(|| 1);
mock.expect_persisted_size().returning(|| 123);
let mut writer = AppendableObjectWriter::new(mock);
writer.append(Bytes::from("test")).await?;
assert_eq!(writer.flush().await?, 123);
assert_eq!(writer.generation(), 1);
assert_eq!(writer.persisted_size(), 123);
let mut mock = MockWriter::new();
mock.expect_finalize().returning(|| {
Ok(crate::model::Object {
size: 456,
..Default::default()
})
});
let writer = AppendableObjectWriter::new(mock);
assert_eq!(writer.finalize().await?.size, 456);
let mut mock = MockWriter::new();
mock.expect_close().returning(|| Ok(789));
let writer = AppendableObjectWriter::new(mock);
assert_eq!(writer.close().await?, 789);
Ok(())
}
mock! {
#[derive(Debug)]
Writer {}
impl crate::stub::AppendableObjectWriter for Writer {
async fn append(&mut self, chunk: Bytes) -> crate::Result<()>;
async fn flush(&mut self) -> crate::Result<i64>;
async fn finalize(self) -> crate::Result<crate::model::Object>;
async fn close(self) -> crate::Result<i64>;
fn generation(&self) -> i64;
fn persisted_size(&self) -> i64;
}
}
}