multipart_write/write/
send_part.rs1use crate::write::Feed;
2use crate::{FusedMultipartWrite, MultipartWrite};
3
4use futures_core::future::FusedFuture;
5use futures_core::ready;
6use std::fmt::{self, Debug, Formatter};
7use std::pin::Pin;
8use std::task::{Context, Poll};
9
10#[must_use = "futures do nothing unless polled"]
12pub struct SendPart<'a, Wr: ?Sized + MultipartWrite<Part>, Part> {
13 feed: Feed<'a, Wr, Part>,
14 output: Option<Wr::Ret>,
15}
16
17impl<Wr: ?Sized + MultipartWrite<Part> + Unpin, Part> Unpin for SendPart<'_, Wr, Part> {}
18
19impl<'a, Wr: ?Sized + MultipartWrite<Part> + Unpin, Part> SendPart<'a, Wr, Part> {
20 pub(super) fn new(writer: &'a mut Wr, part: Part) -> Self {
21 Self {
22 feed: Feed::new(writer, part),
23 output: None,
24 }
25 }
26}
27
28impl<Wr, Part> FusedFuture for SendPart<'_, Wr, Part>
29where
30 Wr: FusedMultipartWrite<Part> + Unpin,
31{
32 fn is_terminated(&self) -> bool {
33 self.feed.is_terminated()
34 }
35}
36
37impl<Wr: ?Sized + MultipartWrite<Part> + Unpin, Part> Future for SendPart<'_, Wr, Part> {
38 type Output = Result<Wr::Ret, Wr::Error>;
39
40 fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
41 let this = &mut *self;
42
43 if this.feed.is_part_pending() {
44 let ret = ready!(Pin::new(&mut this.feed).poll(cx))?;
45 this.output = Some(ret);
46 debug_assert!(!this.feed.is_part_pending());
47 }
48
49 ready!(this.feed.writer_pin_mut().poll_flush(cx))?;
50 let output = this
51 .output
52 .take()
53 .expect("polled SendPart after completion");
54
55 Poll::Ready(Ok(output))
56 }
57}
58
59impl<Wr, Part> Debug for SendPart<'_, Wr, Part>
60where
61 Wr: MultipartWrite<Part> + Debug,
62 Part: Debug,
63 Wr::Ret: Debug,
64{
65 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
66 f.debug_struct("SendPart")
67 .field("feed", &self.feed)
68 .field("output", &self.output)
69 .finish()
70 }
71}