• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 use crate::stream::TryStreamExt;
2 use core::pin::Pin;
3 use futures_core::future::{FusedFuture, Future};
4 use futures_core::stream::{FusedStream, TryStream};
5 use futures_core::task::{Context, Poll};
6 
7 /// Future for the [`try_next`](super::TryStreamExt::try_next) method.
8 #[derive(Debug)]
9 #[must_use = "futures do nothing unless you `.await` or poll them"]
10 pub struct TryNext<'a, St: ?Sized> {
11     stream: &'a mut St,
12 }
13 
14 impl<St: ?Sized + Unpin> Unpin for TryNext<'_, St> {}
15 
16 impl<'a, St: ?Sized + TryStream + Unpin> TryNext<'a, St> {
new(stream: &'a mut St) -> Self17     pub(super) fn new(stream: &'a mut St) -> Self {
18         Self { stream }
19     }
20 }
21 
22 impl<St: ?Sized + TryStream + Unpin + FusedStream> FusedFuture for TryNext<'_, St> {
is_terminated(&self) -> bool23     fn is_terminated(&self) -> bool {
24         self.stream.is_terminated()
25     }
26 }
27 
28 impl<St: ?Sized + TryStream + Unpin> Future for TryNext<'_, St> {
29     type Output = Result<Option<St::Ok>, St::Error>;
30 
poll( mut self: Pin<&mut Self>, cx: &mut Context<'_>, ) -> Poll<Self::Output>31     fn poll(
32         mut self: Pin<&mut Self>,
33         cx: &mut Context<'_>,
34     ) -> Poll<Self::Output> {
35         self.stream.try_poll_next_unpin(cx)?.map(Ok)
36     }
37 }
38