Compare commits

..

1 Commits

Author SHA1 Message Date
Mahmoud Al-Qudsi 458ad98fff Illustrating rust-lang/rfcs#2261 2017-12-24 18:32:27 -06:00
2 changed files with 41 additions and 13 deletions

@ -1,14 +1,20 @@
Compiling futuretest v0.1.0 (file:///mnt/c/Users/Mahmoud/git/futuretest) Compiling futuretest v0.1.0 (file:///mnt/d/GIT/futuretest)
error[E0277]: the trait bound `(): futures::Future` is not satisfied error[E0308]: match arms have incompatible types
--> src/main.rs:17:1 --> src/main.rs:21:13
| |
17 | / fn test() -> MapErr<(), ()> { 21 | / match err {
18 | | future::ok(()) 22 | | ErrorCode::Case1 => case1(),
19 | | .map_err(|String| ()) 23 | | ErrorCode::Case2 => case2(),
20 | | } 24 | | }
| |_^ the trait `futures::Future` is not implemented for `()` | |_____________^ expected anonymized type, found a different anonymized type
| |
= note: required by `futures::MapErr` = note: expected type `impl futures::Future` (anonymized type)
found type `impl futures::Future` (anonymized type)
note: match arm with an incompatible type
--> src/main.rs:23:37
|
23 | ErrorCode::Case2 => case2(),
| ^^^^^^^
error: aborting due to previous error error: aborting due to previous error

@ -6,15 +6,37 @@ use futures::future::{self};
use futures::future::*; use futures::future::*;
use tokio_core::reactor::Core; use tokio_core::reactor::Core;
enum ErrorCode
{
Case1,
Case2,
}
fn main() { fn main() {
let mut core = Core::new().expect("Failed to initialize tokio_core reactor!"); let mut core = Core::new().expect("Failed to initialize tokio_core reactor!");
let f = test(); let f = async_entry_point()
.or_else(move |err| {
//the problem is that the three matches below resolve to different anonymized types
match err {
ErrorCode::Case1 => case1(),
ErrorCode::Case2 => case2(),
}
})
;
core.run(f);
}
fn async_entry_point() -> impl Future<Item=(), Error=ErrorCode> {
future::ok(())
}
core.run(f).unwrap(); fn case1() -> impl Future<Item=(), Error=ErrorCode> {
future::ok(())
} }
fn test() -> MapErr<(), ()> { fn case2() -> impl Future<Item=(), Error=ErrorCode> {
future::ok(()) future::ok(())
.map_err(|String| ())
} }