Skip to content

Commit 4124111

Browse files
authored
Use assert_* functions for all future/stream/sink/io combinators (#2322)
1 parent 1d53a29 commit 4124111

35 files changed

+192
-107
lines changed

futures-util/src/future/abortable.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use super::assert_future;
12
use crate::task::AtomicWaker;
23
use futures_core::future::Future;
34
use futures_core::task::{Context, Poll};
@@ -39,10 +40,10 @@ impl<Fut> Abortable<Fut> where Fut: Future {
3940
/// # });
4041
/// ```
4142
pub fn new(future: Fut, reg: AbortRegistration) -> Self {
42-
Self {
43+
assert_future::<Result<Fut::Output, Aborted>, _>(Self {
4344
future,
4445
inner: reg.inner,
45-
}
46+
})
4647
}
4748
}
4849

futures-util/src/future/future/mod.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@
77
use alloc::boxed::Box;
88
use core::pin::Pin;
99

10-
use crate::future::{assert_future, Either};
11-
use crate::stream::assert_stream;
1210
use crate::fns::{inspect_fn, into_fn, ok_fn, InspectFn, IntoFn, OkFn};
11+
use crate::future::{assert_future, Either};
1312
use crate::never::Never;
13+
use crate::stream::assert_stream;
1414
#[cfg(feature = "alloc")]
1515
use futures_core::future::{BoxFuture, LocalBoxFuture};
1616
use futures_core::{
@@ -506,7 +506,8 @@ pub trait FutureExt: Future {
506506
where
507507
Self: Sized,
508508
{
509-
remote_handle::remote_handle(self)
509+
let (wrapped, handle) = remote_handle::remote_handle(self);
510+
(assert_future::<(), _>(wrapped), handle)
510511
}
511512

512513
/// Wrap the future in a Box, pinning it.

futures-util/src/future/join.rs

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
#![allow(non_snake_case)]
22

3-
use crate::future::{MaybeDone, maybe_done};
3+
use super::assert_future;
4+
use crate::future::{maybe_done, MaybeDone};
45
use core::fmt;
56
use core::pin::Pin;
6-
use futures_core::future::{Future, FusedFuture};
7+
use futures_core::future::{FusedFuture, Future};
78
use futures_core::task::{Context, Poll};
89
use pin_project_lite::pin_project;
910

10-
use super::assert_future;
11-
1211
macro_rules! generate {
1312
($(
1413
$(#[$doc:meta])*
@@ -144,7 +143,8 @@ where
144143
Fut2: Future,
145144
Fut3: Future,
146145
{
147-
Join3::new(future1, future2, future3)
146+
let f = Join3::new(future1, future2, future3);
147+
assert_future::<(Fut1::Output, Fut2::Output, Fut3::Output), _>(f)
148148
}
149149

150150
/// Same as [`join`](join()), but with more futures.
@@ -176,7 +176,8 @@ where
176176
Fut3: Future,
177177
Fut4: Future,
178178
{
179-
Join4::new(future1, future2, future3, future4)
179+
let f = Join4::new(future1, future2, future3, future4);
180+
assert_future::<(Fut1::Output, Fut2::Output, Fut3::Output, Fut4::Output), _>(f)
180181
}
181182

182183
/// Same as [`join`](join()), but with more futures.
@@ -211,5 +212,15 @@ where
211212
Fut4: Future,
212213
Fut5: Future,
213214
{
214-
Join5::new(future1, future2, future3, future4, future5)
215+
let f = Join5::new(future1, future2, future3, future4, future5);
216+
assert_future::<
217+
(
218+
Fut1::Output,
219+
Fut2::Output,
220+
Fut3::Output,
221+
Fut4::Output,
222+
Fut5::Output,
223+
),
224+
_,
225+
>(f)
215226
}

futures-util/src/future/join_all.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use core::task::{Context, Poll};
1010
use alloc::boxed::Box;
1111
use alloc::vec::Vec;
1212

13-
use super::MaybeDone;
13+
use super::{MaybeDone, assert_future};
1414

1515
fn iter_pin_mut<T>(slice: Pin<&mut [T]>) -> impl Iterator<Item = Pin<&mut T>> {
1616
// Safety: `std` _could_ make this unsound if it were to decide Pin's
@@ -85,7 +85,7 @@ where
8585
I::Item: Future,
8686
{
8787
let elems: Box<[_]> = i.into_iter().map(MaybeDone::Future).collect();
88-
JoinAll { elems: elems.into() }
88+
assert_future::<Vec<<I::Item as Future>::Output>, _>(JoinAll { elems: elems.into() })
8989
}
9090

9191
impl<F> Future for JoinAll<F>

futures-util/src/future/lazy.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use super::assert_future;
12
use core::pin::Pin;
23
use futures_core::future::{FusedFuture, Future};
34
use futures_core::task::{Context, Poll};
@@ -34,7 +35,7 @@ impl<F> Unpin for Lazy<F> {}
3435
pub fn lazy<F, R>(f: F) -> Lazy<F>
3536
where F: FnOnce(&mut Context<'_>) -> R,
3637
{
37-
Lazy { f: Some(f) }
38+
assert_future::<R, _>(Lazy { f: Some(f) })
3839
}
3940

4041
impl<F, R> FusedFuture for Lazy<F>

futures-util/src/future/maybe_done.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
//! Definition of the MaybeDone combinator
22
3+
use super::assert_future;
34
use core::mem;
45
use core::pin::Pin;
56
use futures_core::future::{FusedFuture, Future};
@@ -40,7 +41,7 @@ impl<Fut: Future + Unpin> Unpin for MaybeDone<Fut> {}
4041
/// # });
4142
/// ```
4243
pub fn maybe_done<Fut: Future>(future: Fut) -> MaybeDone<Fut> {
43-
MaybeDone::Future(future)
44+
assert_future::<(), _>(MaybeDone::Future(future))
4445
}
4546

4647
impl<Fut: Future> MaybeDone<Fut> {

futures-util/src/future/pending.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use super::assert_future;
12
use core::marker;
23
use core::pin::Pin;
34
use futures_core::future::{FusedFuture, Future};
@@ -33,9 +34,9 @@ impl<T> FusedFuture for Pending<T> {
3334
/// # });
3435
/// ```
3536
pub fn pending<T>() -> Pending<T> {
36-
Pending {
37+
assert_future::<T, _>(Pending {
3738
_data: marker::PhantomData,
38-
}
39+
})
3940
}
4041

4142
impl<T> Future for Pending<T> {

futures-util/src/future/poll_fn.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
//! Definition of the `PollFn` adapter combinator
22
3+
use super::assert_future;
34
use core::fmt;
45
use core::pin::Pin;
56
use futures_core::future::Future;
@@ -36,7 +37,7 @@ pub fn poll_fn<T, F>(f: F) -> PollFn<F>
3637
where
3738
F: FnMut(&mut Context<'_>) -> Poll<T>
3839
{
39-
PollFn { f }
40+
assert_future::<T, _>(PollFn { f })
4041
}
4142

4243
impl<F> fmt::Debug for PollFn<F> {

futures-util/src/future/ready.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use super::assert_future;
12
use core::pin::Pin;
23
use futures_core::future::{FusedFuture, Future};
34
use futures_core::task::{Context, Poll};
@@ -45,7 +46,7 @@ impl<T> Future for Ready<T> {
4546
/// # });
4647
/// ```
4748
pub fn ready<T>(t: T) -> Ready<T> {
48-
Ready(Some(t))
49+
assert_future::<T, _>(Ready(Some(t)))
4950
}
5051

5152
/// Create a future that is immediately ready with a success value.

futures-util/src/future/select.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use super::assert_future;
12
use core::pin::Pin;
23
use futures_core::future::{Future, FusedFuture};
34
use futures_core::task::{Context, Poll};
@@ -75,7 +76,7 @@ impl<A: Unpin, B: Unpin> Unpin for Select<A, B> {}
7576
pub fn select<A, B>(future1: A, future2: B) -> Select<A, B>
7677
where A: Future + Unpin, B: Future + Unpin
7778
{
78-
Select { inner: Some((future1, future2)) }
79+
assert_future::<Either<(A::Output, B), (B::Output, A)>, _>(Select { inner: Some((future1, future2)) })
7980
}
8081

8182
impl<A, B> Future for Select<A, B>

futures-util/src/future/select_all.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use super::assert_future;
12
use crate::future::FutureExt;
23
use core::iter::FromIterator;
34
use core::mem;
@@ -38,7 +39,7 @@ pub fn select_all<I>(iter: I) -> SelectAll<I::Item>
3839
inner: iter.into_iter().collect()
3940
};
4041
assert!(!ret.inner.is_empty());
41-
ret
42+
assert_future::<(<I::Item as Future>::Output, usize, Vec<I::Item>), _>(ret)
4243
}
4344

4445
impl<Fut: Future + Unpin> Future for SelectAll<Fut> {

futures-util/src/future/select_ok.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use super::assert_future;
12
use crate::future::TryFutureExt;
23
use core::iter::FromIterator;
34
use core::mem;
@@ -36,7 +37,7 @@ pub fn select_ok<I>(iter: I) -> SelectOk<I::Item>
3637
inner: iter.into_iter().collect()
3738
};
3839
assert!(!ret.inner.is_empty(), "iterator provided to select_ok was empty");
39-
ret
40+
assert_future::<Result<(<I::Item as TryFuture>::Ok, Vec<I::Item>), <I::Item as TryFuture>::Error>, _>(ret)
4041
}
4142

4243
impl<Fut: TryFuture + Unpin> Future for SelectOk<Fut> {

futures-util/src/future/try_future/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ pub trait TryFutureExt: TryFuture {
173173
Self::Ok: Sink<Item, Error = Self::Error>,
174174
Self: Sized,
175175
{
176-
FlattenSink::new(self)
176+
crate::sink::assert_sink::<Item, Self::Error, _>(FlattenSink::new(self))
177177
}
178178

179179
/// Maps this future's success value to a different value.
@@ -501,7 +501,7 @@ pub trait TryFutureExt: TryFuture {
501501
Self::Ok: TryFuture<Error = Self::Error>,
502502
Self: Sized,
503503
{
504-
TryFlatten::new(self)
504+
assert_future::<Result<<Self::Ok as TryFuture>::Ok, Self::Error>, _>(TryFlatten::new(self))
505505
}
506506

507507
/// Flatten the execution of this future when the successful result of this

futures-util/src/future/try_join.rs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#![allow(non_snake_case)]
22

3-
use crate::future::{TryMaybeDone, try_maybe_done};
3+
use crate::future::{assert_future, try_maybe_done, TryMaybeDone};
44
use core::fmt;
55
use core::pin::Pin;
66
use futures_core::future::{Future, TryFuture};
@@ -150,7 +150,7 @@ where
150150
Fut1: TryFuture,
151151
Fut2: TryFuture<Error = Fut1::Error>,
152152
{
153-
TryJoin::new(future1, future2)
153+
assert_future::<Result<(Fut1::Ok, Fut2::Ok), Fut1::Error>, _>(TryJoin::new(future1, future2))
154154
}
155155

156156
/// Same as [`try_join`](try_join()), but with more futures.
@@ -179,7 +179,9 @@ where
179179
Fut2: TryFuture<Error = Fut1::Error>,
180180
Fut3: TryFuture<Error = Fut1::Error>,
181181
{
182-
TryJoin3::new(future1, future2, future3)
182+
assert_future::<Result<(Fut1::Ok, Fut2::Ok, Fut3::Ok), Fut1::Error>, _>(TryJoin3::new(
183+
future1, future2, future3,
184+
))
183185
}
184186

185187
/// Same as [`try_join`](try_join()), but with more futures.
@@ -211,7 +213,9 @@ where
211213
Fut3: TryFuture<Error = Fut1::Error>,
212214
Fut4: TryFuture<Error = Fut1::Error>,
213215
{
214-
TryJoin4::new(future1, future2, future3, future4)
216+
assert_future::<Result<(Fut1::Ok, Fut2::Ok, Fut3::Ok, Fut4::Ok), Fut1::Error>, _>(
217+
TryJoin4::new(future1, future2, future3, future4),
218+
)
215219
}
216220

217221
/// Same as [`try_join`](try_join()), but with more futures.
@@ -246,5 +250,7 @@ where
246250
Fut4: TryFuture<Error = Fut1::Error>,
247251
Fut5: TryFuture<Error = Fut1::Error>,
248252
{
249-
TryJoin5::new(future1, future2, future3, future4, future5)
253+
assert_future::<Result<(Fut1::Ok, Fut2::Ok, Fut3::Ok, Fut4::Ok, Fut5::Ok), Fut1::Error>, _>(
254+
TryJoin5::new(future1, future2, future3, future4, future5),
255+
)
250256
}

futures-util/src/future/try_join_all.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use core::task::{Context, Poll};
1010
use alloc::boxed::Box;
1111
use alloc::vec::Vec;
1212

13-
use super::{TryFuture, TryMaybeDone};
13+
use super::{assert_future, TryFuture, TryMaybeDone};
1414

1515
fn iter_pin_mut<T>(slice: Pin<&mut [T]>) -> impl Iterator<Item = Pin<&mut T>> {
1616
// Safety: `std` _could_ make this unsound if it were to decide Pin's
@@ -93,9 +93,9 @@ where
9393
I::Item: TryFuture,
9494
{
9595
let elems: Box<[_]> = i.into_iter().map(TryMaybeDone::Future).collect();
96-
TryJoinAll {
96+
assert_future::<Result<Vec<<I::Item as TryFuture>::Ok>, <I::Item as TryFuture>::Error>, _>(TryJoinAll {
9797
elems: elems.into(),
98-
}
98+
})
9999
}
100100

101101
impl<F> Future for TryJoinAll<F>

futures-util/src/future/try_maybe_done.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
//! Definition of the TryMaybeDone combinator
22
3+
use super::assert_future;
34
use core::mem;
45
use core::pin::Pin;
56
use futures_core::future::{FusedFuture, Future, TryFuture};
@@ -25,7 +26,7 @@ impl<Fut: TryFuture + Unpin> Unpin for TryMaybeDone<Fut> {}
2526

2627
/// Wraps a future into a `TryMaybeDone`
2728
pub fn try_maybe_done<Fut: TryFuture>(future: Fut) -> TryMaybeDone<Fut> {
28-
TryMaybeDone::Future(future)
29+
assert_future::<Result<(), Fut::Error>, _>(TryMaybeDone::Future(future))
2930
}
3031

3132
impl<Fut: TryFuture> TryMaybeDone<Fut> {

futures-util/src/future/try_select.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,10 @@ impl<A: Unpin, B: Unpin> Unpin for TrySelect<A, B> {}
5050
pub fn try_select<A, B>(future1: A, future2: B) -> TrySelect<A, B>
5151
where A: TryFuture + Unpin, B: TryFuture + Unpin
5252
{
53-
TrySelect { inner: Some((future1, future2)) }
53+
super::assert_future::<Result<
54+
Either<(A::Ok, B), (B::Ok, A)>,
55+
Either<(A::Error, B), (B::Error, A)>,
56+
>, _>(TrySelect { inner: Some((future1, future2)) })
5457
}
5558

5659
impl<A: Unpin, B: Unpin> Future for TrySelect<A, B>

0 commit comments

Comments
 (0)