fut_compat/task/
tokio.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 [`tokio`](https://docs.rs/tokio) runtime.
10#[cfg(feature = "tokio-rt")]
11#[cfg_attr(docsrs, doc(cfg(feature = "tokio-rt")))]
12#[derive(Default, Clone, Copy, Debug, PartialEq, Eq, Hash)]
13pub struct TokioExecutor {}
14
15impl Spawn for TokioExecutor {
16    fn spawn_obj(
17        &self,
18        future: FutureObj<'static, ()>
19    ) -> Result<(), SpawnError> {
20        ::tokio::task::spawn(future);
21
22        Ok(())
23    }
24}
25
26impl LocalSpawn for TokioExecutor {
27    fn spawn_local_obj(
28        &self,
29        future: LocalFutureObj<'static, ()>
30    ) -> Result<(), SpawnError> {
31        ::tokio::task::spawn_local(future);
32
33        Ok(())
34    }
35}
36
37impl SpawnBlocking for TokioExecutor {
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 = ::tokio::task::spawn_blocking::<F, T>(f);
44        let fut = FutureExt::map(fut, |result| result.map_err(|err| {
45            let box_err: Box<dyn Error> = Box::new(err);
46
47            box_err
48        }));
49
50        JoinHandle::new(fut)
51    }
52}