fut_compat/task/
async_std.rs

1use super::*;
2
3use futures::task::{Spawn, LocalSpawn};
4use futures::task::{SpawnError, FutureObj, LocalFutureObj};
5use futures::FutureExt;
6
7
8
9/// An executor for the [`async_std`](https://docs.rs/async-std) runtime.
10#[cfg(feature = "async-std-rt")]
11#[cfg_attr(docsrs, doc(cfg(feature = "async-std-rt")))]
12#[derive(Default, Clone, Copy, Debug, PartialEq, Eq, Hash)]
13pub struct AsyncStdExecutor {}
14
15impl Spawn for AsyncStdExecutor {
16    fn spawn_obj(
17        &self,
18        future: FutureObj<'static, ()>
19    ) -> Result<(), SpawnError> {
20        ::async_std::task::spawn(future);
21
22        Ok(())
23    }
24}
25
26impl LocalSpawn for AsyncStdExecutor {
27    fn spawn_local_obj(
28        &self,
29        future: LocalFutureObj<'static, ()>
30    ) -> Result<(), SpawnError> {
31        ::async_std::task::spawn_local(future);
32
33        Ok(())
34    }
35}
36
37impl SpawnBlocking for AsyncStdExecutor {
38    fn spawn_blocking<F, T>(f: F) -> JoinHandle<T>
39    where
40        F: FnOnce() -> T + Send + 'static,
41        T: Send + 'static,
42    {
43        let fut = ::async_std::task::spawn_blocking::<F, T>(f);
44        let fut = FutureExt::map(fut, |ret| {
45            let result: Result<T, Box<dyn Error>> = Ok(ret);
46
47            result
48        });
49
50        JoinHandle::new(fut)
51    }
52}