1use super::*;
2
3use futures::task::{Spawn, LocalSpawn};
4use futures::task::{SpawnError, FutureObj, LocalFutureObj};
5use futures::FutureExt;
6
7
8
9#[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}