Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- use futures;
- use futures::future::Either;
- use futures::sync::oneshot;
- use futures::Future;
- use std::thread;
- use std::time::Duration;
- use tokio;
- #[derive(Debug)]
- struct MyError {
- error_code: i32,
- }
- impl From<oneshot::Canceled> for MyError {
- fn from(_: oneshot::Canceled) -> MyError {
- MyError { error_code: 1 }
- }
- }
- fn query_data() -> Result<i32, ()> {
- Ok(1)
- }
- fn send_promise_to_worker(sx: oneshot::Sender<i32>) -> Result<(), ()> {
- // Send the oneshot somewhere in a way that might fail, eg. over a channel
- thread::spawn(move || {
- thread::sleep(Duration::from_millis(100));
- sx.send(100).unwrap();
- });
- Ok(())
- }
- fn deferred_task() -> impl Future<Item = i32, Error = MyError> {
- let (sx, rx) = oneshot::channel();
- match query_data() {
- Ok(_i) => match send_promise_to_worker(sx) {
- Ok(_) => Either::A(rx.map_err(|e| MyError::from(e))),
- Err(_e) => Either::B(futures::failed(MyError { error_code: 2 })),
- },
- Err(_) => Either::B(futures::failed(MyError { error_code: 2 })),
- }
- }
- fn main() {
- tokio::run(deferred_task().then(|r| {
- println!("{:?}", r);
- Ok(())
- }));
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement