|
1 | 1 |
|
2 |
| -pub trait ExecCompat: Executor01< |
3 |
| - Compat<FutureObj<'static, ()>, BoxedExecutor> |
4 |
| - > + Clone + Send + 'static |
| 2 | +use futures::future::Executor as Executor01; |
| 3 | + |
| 4 | +use futures_core::task::Executor as Executor03; |
| 5 | +use futures_core::task as task03; |
| 6 | +use futures_core::future::FutureObj; |
| 7 | + |
| 8 | +use super::Compat; |
| 9 | +use crate::{TryFutureExt, FutureExt, future::NeverError}; |
| 10 | + |
| 11 | +pub struct BoxedExecutor(Box<dyn Executor03 + Send>); |
| 12 | + |
| 13 | +impl Executor03 for BoxedExecutor { |
| 14 | + fn spawn_obj(&mut self, future: FutureObj<'static, ()>) -> Result<(), task03::SpawnObjError> { |
| 15 | + (&mut *self.0).spawn_obj(future) |
| 16 | + } |
| 17 | +} |
| 18 | + |
| 19 | +/// A future that can run on a futures 0.1 executor. |
| 20 | +pub type ExecutorFuture01 = Compat<NeverError<FutureObj<'static, ()>>, BoxedExecutor>; |
| 21 | + |
| 22 | +/// Extension trait for futures 0.1 Executors. |
| 23 | +pub trait Executor01CompatExt: Executor01<ExecutorFuture01> |
| 24 | + + Clone + Send + 'static |
5 | 25 | {
|
6 |
| - fn compat(self) -> ExecutorCompat<Self> |
| 26 | + /// Creates an exector compatable with futures 0.3. |
| 27 | + fn compat(self) -> CompatExecutor<Self> |
7 | 28 | where Self: Sized;
|
8 | 29 | }
|
9 | 30 |
|
10 |
| -impl<E> ExecCompat for E |
11 |
| -where E: Executor01< |
12 |
| - Compat<FutureObj<'static, ()>, BoxedExecutor> |
13 |
| - >, |
| 31 | +impl<E> Executor01CompatExt for E |
| 32 | +where E: Executor01<ExecutorFuture01>, |
14 | 33 | E: Clone + Send + 'static
|
15 | 34 | {
|
16 |
| - fn compat(self) -> ExecutorCompat<Self> { |
17 |
| - ExecutorCompat { |
| 35 | + fn compat(self) -> CompatExecutor<Self> { |
| 36 | + CompatExecutor { |
18 | 37 | exec: self,
|
19 | 38 | }
|
20 | 39 | }
|
21 | 40 | }
|
22 | 41 |
|
| 42 | +/// Converts `futures 0.1` Executors into `futures 0.3` Executors |
23 | 43 | #[derive(Clone)]
|
24 |
| -pub struct ExecutorCompat<E> { |
| 44 | +pub struct CompatExecutor<E> { |
25 | 45 | exec: E
|
26 | 46 | }
|
27 | 47 |
|
28 |
| -impl<E> Executor03 for ExecutorCompat<E> |
29 |
| - where E: Executor01< |
30 |
| - Compat<FutureObj<'static, ()>, Box<Executor03>> |
31 |
| - >, |
| 48 | +impl<E> Executor03 for CompatExecutor<E> |
| 49 | + where E: Executor01<ExecutorFuture01>, |
32 | 50 | E: Clone + Send + 'static,
|
33 | 51 | {
|
34 |
| - fn spawn_obj(&mut self, obj: FutureObj<'static, ()>) -> Result<(), task::SpawnObjError> { |
| 52 | + fn spawn_obj( |
| 53 | + &mut self, |
| 54 | + future: FutureObj<'static, ()>, |
| 55 | + ) -> Result<(), task03::SpawnObjError> { |
35 | 56 |
|
36 |
| - self.exec.execute(obj.compat(Box::new(self.clone()))) |
37 |
| - .map_err(|exec_err| { |
38 |
| - use futures_core::task::{SpawnObjError, SpawnErrorKind}; |
| 57 | + let fut = future.never_error().compat(BoxedExecutor(Box::new(self.clone()))); |
| 58 | + |
| 59 | + self.exec.execute(fut) |
| 60 | + .map_err(|exec_err| { |
| 61 | + use futures_core::task::{SpawnObjError, SpawnErrorKind}; |
39 | 62 |
|
40 |
| - let fut = exec_err.into_future().compat().map(|_| ()); |
41 |
| - SpawnObjError { |
42 |
| - kind: SpawnErrorKind::shutdown(), |
43 |
| - task: Box::new(fut).into(), |
44 |
| - } |
45 |
| - }) |
| 63 | + let fut = exec_err.into_future().into_inner().unwrap_or_else(|_| ()); |
| 64 | + SpawnObjError { |
| 65 | + kind: SpawnErrorKind::shutdown(), |
| 66 | + task: Box::new(fut).into(), |
| 67 | + } |
| 68 | + }) |
46 | 69 | }
|
47 | 70 | }
|
0 commit comments