1#![cfg_attr(docsrs, feature(doc_cfg))]
30use std::collections::VecDeque;
31use std::convert::Infallible as Never;
32use std::ops::DerefMut;
33use std::pin::Pin;
34use std::task::{Context, Poll};
35
36pub mod io;
37pub mod stream;
38pub mod write;
39
40pub mod prelude {
42 pub use super::stream::{self, MultipartStreamExt as _};
43 pub use super::write::{self, MultipartWriteExt as _};
44 pub use super::{FusedMultipartWrite, MultipartWrite};
45}
46
47pub trait MultipartWrite<Part> {
50 type Ret;
52
53 type Output;
55
56 type Error;
58
59 fn poll_ready(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>>;
71
72 fn start_send(self: Pin<&mut Self>, part: Part) -> Result<Self::Ret, Self::Error>;
88
89 fn poll_flush(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>>;
97
98 fn poll_complete(
106 self: Pin<&mut Self>,
107 cx: &mut Context<'_>,
108 ) -> Poll<Result<Self::Output, Self::Error>>;
109}
110
111pub type BoxMultipartWrite<'a, Part, R, T, E> =
114 Pin<Box<dyn MultipartWrite<Part, Ret = R, Output = T, Error = E> + Send + 'a>>;
115
116pub type LocalBoxMultipartWrite<'a, Part, R, T, E> =
118 Pin<Box<dyn MultipartWrite<Part, Ret = R, Output = T, Error = E> + 'a>>;
119
120pub trait FusedMultipartWrite<Part>: MultipartWrite<Part> {
123 fn is_terminated(&self) -> bool;
125}
126
127impl<W: ?Sized + MultipartWrite<Part> + Unpin, Part> MultipartWrite<Part> for &mut W {
128 type Ret = W::Ret;
129 type Output = W::Output;
130 type Error = W::Error;
131
132 fn poll_ready(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
133 Pin::new(&mut **self).poll_ready(cx)
134 }
135
136 fn start_send(mut self: Pin<&mut Self>, part: Part) -> Result<Self::Ret, Self::Error> {
137 Pin::new(&mut **self).start_send(part)
138 }
139
140 fn poll_flush(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
141 Pin::new(&mut **self).poll_flush(cx)
142 }
143
144 fn poll_complete(
145 mut self: Pin<&mut Self>,
146 cx: &mut Context<'_>,
147 ) -> Poll<Result<Self::Output, Self::Error>> {
148 Pin::new(&mut **self).poll_complete(cx)
149 }
150}
151
152impl<W: ?Sized + FusedMultipartWrite<Part> + Unpin, Part> FusedMultipartWrite<Part> for &mut W {
153 fn is_terminated(&self) -> bool {
154 <W as FusedMultipartWrite<Part>>::is_terminated(&**self)
155 }
156}
157
158impl<P, Part> MultipartWrite<Part> for Pin<P>
159where
160 P: DerefMut + Unpin,
161 P::Target: MultipartWrite<Part>,
162{
163 type Ret = <P::Target as MultipartWrite<Part>>::Ret;
164 type Output = <P::Target as MultipartWrite<Part>>::Output;
165 type Error = <P::Target as MultipartWrite<Part>>::Error;
166
167 fn poll_ready(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
168 self.get_mut().as_mut().poll_ready(cx)
169 }
170
171 fn start_send(self: Pin<&mut Self>, part: Part) -> Result<Self::Ret, Self::Error> {
172 self.get_mut().as_mut().start_send(part)
173 }
174
175 fn poll_flush(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
176 self.get_mut().as_mut().poll_flush(cx)
177 }
178
179 fn poll_complete(
180 self: Pin<&mut Self>,
181 cx: &mut Context<'_>,
182 ) -> Poll<Result<Self::Output, Self::Error>> {
183 self.get_mut().as_mut().poll_complete(cx)
184 }
185}
186
187impl<P, Part> FusedMultipartWrite<Part> for Pin<P>
188where
189 P: DerefMut + Unpin,
190 P::Target: FusedMultipartWrite<Part>,
191{
192 fn is_terminated(&self) -> bool {
193 <P::Target as FusedMultipartWrite<Part>>::is_terminated(&**self)
194 }
195}
196
197impl<T> MultipartWrite<T> for Vec<T> {
198 type Ret = ();
199 type Output = Self;
200 type Error = Never;
201
202 fn poll_ready(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
203 Poll::Ready(Ok(()))
204 }
205
206 fn start_send(self: Pin<&mut Self>, part: T) -> Result<Self::Ret, Self::Error> {
207 unsafe { self.get_unchecked_mut() }.push(part);
208 Ok(())
209 }
210
211 fn poll_flush(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
212 Poll::Ready(Ok(()))
213 }
214
215 fn poll_complete(
216 self: Pin<&mut Self>,
217 _cx: &mut Context<'_>,
218 ) -> Poll<Result<Self::Output, Self::Error>> {
219 let this: &mut Vec<T> = unsafe { self.get_unchecked_mut() };
220 let out = std::mem::take(this);
221 Poll::Ready(Ok(out))
222 }
223}
224
225impl<T> MultipartWrite<T> for VecDeque<T> {
226 type Ret = ();
227 type Output = Self;
228 type Error = Never;
229
230 fn poll_ready(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
231 Poll::Ready(Ok(()))
232 }
233
234 fn start_send(self: Pin<&mut Self>, part: T) -> Result<Self::Ret, Self::Error> {
235 unsafe { self.get_unchecked_mut() }.push_back(part);
236 Ok(())
237 }
238
239 fn poll_flush(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
240 Poll::Ready(Ok(()))
241 }
242
243 fn poll_complete(
244 self: Pin<&mut Self>,
245 _cx: &mut Context<'_>,
246 ) -> Poll<Result<Self::Output, Self::Error>> {
247 let this: &mut VecDeque<T> = unsafe { self.get_unchecked_mut() };
248 let out = std::mem::take(this);
249 Poll::Ready(Ok(out))
250 }
251}