use std::time::Duration;
use futures::Stream;
use multipart_write::stream::{
CompleteWith, MultipartStreamExt as _, TryCompleteWhen,
};
use multipart_write::{FusedMultipartWrite, MultipartWrite};
use self::multipart_upload::UploadStatus;
use crate::client::part::EntityTag;
use crate::uri::ObjectUri;
pub mod multipart_upload;
mod part_buffer;
pub mod with_part_encoder;
#[derive(Debug, Clone)]
pub struct Uploaded {
pub uri: ObjectUri,
pub etag: EntityTag,
pub bytes: u64,
pub parts: u64,
pub items: Option<u64>,
pub duration: Duration,
}
pub trait ShouldComplete {
fn should_complete(&self) -> bool;
}
pub type CollectUpload<St, U> = CompleteWith<St, U>;
pub type TryUploadWhen<St, U, F> = TryCompleteWhen<St, U, F>;
pub trait UploadStreamExt: Stream {
fn collect_upload<U>(self, upload: U) -> CollectUpload<Self, U>
where
Self: Sized,
U: MultipartWrite<Self::Item>,
{
self.complete_with(upload)
}
fn try_upload<U, R>(
self,
upload: U,
) -> TryUploadWhen<Self, U, fn(R) -> bool>
where
Self: Sized,
U: FusedMultipartWrite<Self::Item, Recv = R>,
R: ShouldComplete,
{
self.try_complete_when(upload, |r| r.should_complete())
}
fn try_upload_when<U, F>(
self,
uploader: U,
f: F,
) -> TryUploadWhen<Self, U, F>
where
Self: Sized,
U: FusedMultipartWrite<Self::Item>,
F: FnMut(U::Recv) -> bool,
{
self.try_complete_when(uploader, f)
}
}
impl<St: Stream> UploadStreamExt for St {}