use crate::Result;
use crate::model::{Object, ReadObjectRequest};
use crate::model_ext::WriteObjectRequest;
use crate::read_object::ReadObjectResponse;
use crate::storage::client::StorageInner;
use crate::storage::perform_upload::PerformUpload;
use crate::storage::read_object::Reader;
use crate::storage::request_options::RequestOptions;
use crate::storage::streaming_source::{Seek, StreamingSource};
use std::sync::Arc;
#[derive(Clone, Debug)]
pub struct Storage {
inner: Arc<StorageInner>,
}
impl Storage {
pub(crate) fn new(inner: Arc<StorageInner>) -> Arc<Self> {
Arc::new(Self { inner })
}
}
impl super::stub::Storage for Storage {
async fn read_object(
&self,
req: ReadObjectRequest,
options: RequestOptions,
) -> Result<ReadObjectResponse> {
let reader = Reader {
inner: self.inner.clone(),
request: req,
options,
};
reader.response().await
}
async fn write_object_buffered<P>(
&self,
payload: P,
req: WriteObjectRequest,
options: RequestOptions,
) -> Result<Object>
where
P: StreamingSource + Send + Sync + 'static,
{
PerformUpload::new(payload, self.inner.clone(), req.spec, req.params, options)
.send()
.await
}
async fn write_object_unbuffered<P>(
&self,
payload: P,
req: WriteObjectRequest,
options: RequestOptions,
) -> Result<Object>
where
P: StreamingSource + Seek + Send + Sync + 'static,
{
PerformUpload::new(payload, self.inner.clone(), req.spec, req.params, options)
.send_unbuffered()
.await
}
}