futures_util/compat/
executor.rs1use super::{Compat, Future01CompatExt};
2use crate::{
3 future::{FutureExt, TryFutureExt, UnitError},
4 task::SpawnExt,
5};
6use futures_01::future::{ExecuteError as ExecuteError01, Executor as Executor01};
7use futures_01::Future as Future01;
8use futures_task::{FutureObj, Spawn as Spawn03, SpawnError as SpawnError03};
9
10pub type Executor01Future = Compat<UnitError<FutureObj<'static, ()>>>;
13
14pub trait Executor01CompatExt: Executor01<Executor01Future> + Clone + Send + 'static {
16 fn compat(self) -> Executor01As03<Self>
43 where
44 Self: Sized;
45}
46
47impl<Ex> Executor01CompatExt for Ex
48where
49 Ex: Executor01<Executor01Future> + Clone + Send + 'static,
50{
51 fn compat(self) -> Executor01As03<Self> {
52 Executor01As03 { executor01: self }
53 }
54}
55
56#[derive(Debug, Clone)]
59pub struct Executor01As03<Ex> {
60 executor01: Ex,
61}
62
63impl<Ex> Spawn03 for Executor01As03<Ex>
64where
65 Ex: Executor01<Executor01Future> + Clone + Send + 'static,
66{
67 fn spawn_obj(&self, future: FutureObj<'static, ()>) -> Result<(), SpawnError03> {
68 let future = future.unit_error().compat();
69
70 self.executor01.execute(future).map_err(|_| SpawnError03::shutdown())
71 }
72}
73
74#[allow(single_use_lifetimes)] impl<Sp, Fut> Executor01<Fut> for Compat<Sp>
76where
77 for<'a> &'a Sp: Spawn03,
78 Fut: Future01<Item = (), Error = ()> + Send + 'static,
79{
80 fn execute(&self, future: Fut) -> Result<(), ExecuteError01<Fut>> {
81 (&self.inner)
82 .spawn(future.compat().map(|_| ()))
83 .expect("unable to spawn future from Compat executor");
84 Ok(())
85 }
86}