Skip to main content

multipart_write/write/
send_flush.rs

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