aws_multipart_upload/write/
mod.rs1use crate::client::UploadClient;
8use crate::client::part::{CompletedParts, PartBody};
9use crate::client::request::{CompletedUpload, SendUploadPart};
10use crate::codec::PartEncoder;
11use crate::error::Error as UploadError;
12use crate::uri::ObjectUriIter;
13
14use bytesize::ByteSize;
15use futures::Stream;
16use multipart_write::stream::{Assemble, Assembled};
17use multipart_write::{FusedMultipartWrite, MultipartStreamExt as _, MultipartWrite};
18
19mod encoded;
20pub use self::encoded::{EncodedUpload, Status};
21
22mod part_buffer;
23pub use self::part_buffer::PartBuffer;
24
25mod upload;
26pub use self::upload::{Upload, UploadSent};
27
28pub type MultipartUpload<E> = EncodedUpload<E, Upload<PartBuffer>>;
30
31pub trait AwsMultipartUpload<Item>
33where
34 Self: FusedMultipartWrite<Item, Ret = Status, Error = UploadError, Output = CompletedUpload>,
35{
36}
37
38impl<Item, E: PartEncoder<Item>> AwsMultipartUpload<Item> for MultipartUpload<E> {}
39
40pub trait UploadWriteExt<Part>: MultipartWrite<Part> {
42 fn upload(self, client: &UploadClient, iter: ObjectUriIter) -> Upload<Self>
45 where
46 Self: MultipartWrite<SendUploadPart, Error = UploadError, Output = CompletedParts> + Sized,
47 {
48 Upload::new(self, client, iter)
49 }
50
51 fn encoded_upload<E>(
57 self,
58 encoder: E,
59 bytes: ByteSize,
60 part_bytes: ByteSize,
61 ) -> EncodedUpload<E, Self>
62 where
63 Self: MultipartWrite<
64 PartBody,
65 Ret = UploadSent,
66 Error = UploadError,
67 Output = CompletedUpload,
68 > + Sized,
69 {
70 EncodedUpload::new(self, encoder, bytes.as_u64(), part_bytes.as_u64())
71 }
72}
73
74impl<Part, Wr: MultipartWrite<Part>> UploadWriteExt<Part> for Wr {}
75
76pub type CollectUpload<St, U> = Assemble<St, U>;
78
79pub type IntoUpload<St, U, F> = Assembled<St, U, F>;
81
82pub trait UploadStreamExt: Stream {
84 fn collect_upload<U>(self, uploader: U) -> CollectUpload<Self, U>
87 where
88 Self: Sized,
89 U: FusedMultipartWrite<Self::Item, Error = UploadError, Output = CompletedUpload>,
90 {
91 self.assemble(uploader)
92 }
93
94 fn into_upload<U>(self, uploader: U) -> IntoUpload<Self, U, fn(&Status) -> bool>
101 where
102 Self: Sized,
103 U: FusedMultipartWrite<
104 Self::Item,
105 Ret = Status,
106 Error = UploadError,
107 Output = CompletedUpload,
108 >,
109 {
110 self.assembled(uploader, |status| status.should_complete)
111 }
112
113 fn into_upload_when<U, F>(self, uploader: U, f: F) -> IntoUpload<Self, U, F>
117 where
118 Self: Sized,
119 U: FusedMultipartWrite<Self::Item, Error = UploadError, Output = CompletedUpload>,
120 F: FnMut(&U::Ret) -> bool,
121 {
122 self.assembled(uploader, f)
123 }
124}
125
126impl<St: Stream> UploadStreamExt for St {}