use std::sync::Arc;
use futures::io::Cursor;
use time::Duration;
use crate::raw::*;
use crate::*;
pub struct ObjectMultipart {
acc: Arc<dyn Accessor>,
path: String,
upload_id: String,
}
impl ObjectMultipart {
pub fn new(op: Operator, path: &str, upload_id: &str) -> Self {
Self {
acc: op.inner(),
path: normalize_path(path),
upload_id: upload_id.to_string(),
}
}
pub fn operatoer(&self) -> Operator {
self.acc.clone().into()
}
pub async fn write(&self, part_number: usize, bs: impl Into<Vec<u8>>) -> Result<ObjectPart> {
let bs = bs.into();
let op = OpWriteMultipart::new(self.upload_id.clone(), part_number, bs.len() as u64);
let r = Cursor::new(bs);
let rp = self
.acc
.write_multipart(&self.path, op, Box::new(r))
.await?;
Ok(rp.into_object_part())
}
pub async fn complete(&self, parts: Vec<ObjectPart>) -> Result<Object> {
let op = OpCompleteMultipart::new(self.upload_id.clone(), parts);
self.acc.complete_multipart(&self.path, op).await?;
Ok(Object::new(self.acc.clone().into(), &self.path))
}
pub async fn abort(&self) -> Result<()> {
let op = OpAbortMultipart::new(self.upload_id.clone());
let _ = self.acc.abort_multipart(&self.path, op).await?;
Ok(())
}
pub fn presign_write(&self, part_number: usize, expire: Duration) -> Result<PresignedRequest> {
let op = OpPresign::new(
OpWriteMultipart::new(self.upload_id.clone(), part_number, 0),
expire,
);
let rp = self.acc.presign(&self.path, op)?;
Ok(rp.into_presigned_request())
}
}
#[derive(Debug, Clone, Default)]
pub struct ObjectPart {
part_number: usize,
etag: String,
}
impl ObjectPart {
pub fn new(part_number: usize, etag: &str) -> Self {
Self {
part_number,
etag: etag.to_string(),
}
}
pub fn part_number(&self) -> usize {
self.part_number
}
pub fn etag(&self) -> &str {
&self.etag
}
}