diff options
Diffstat (limited to 'src/executor.rs')
-rw-r--r-- | src/executor.rs | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/src/executor.rs b/src/executor.rs new file mode 100644 index 00000000..b4be5264 --- /dev/null +++ b/src/executor.rs @@ -0,0 +1,68 @@ +//! Choose your preferred executor to power your application. +pub use crate::common::{executor::Null, Executor}; + +pub use platform::Default; + +#[cfg(not(target_arch = "wasm32"))] +mod platform { + use iced_futures::{executor, futures}; + + #[cfg(feature = "tokio")] + type Executor = executor::Tokio; + + #[cfg(all(not(feature = "tokio"), feature = "async-std"))] + type Executor = executor::AsyncStd; + + #[cfg(not(any(feature = "tokio", feature = "async-std")))] + type Executor = executor::ThreadPool; + + /// A default cross-platform executor. + /// + /// - On native platforms, it will use: + /// - `iced_futures::executor::Tokio` when the `tokio` feature is enabled. + /// - `iced_futures::executor::AsyncStd` when the `async-std` feature is + /// enabled. + /// - `iced_futures::executor::ThreadPool` otherwise. + /// - On the Web, it will use `iced_futures::executor::WasmBindgen`. + #[derive(Debug)] + pub struct Default(Executor); + + impl super::Executor for Default { + fn new() -> Result<Self, futures::io::Error> { + Ok(Default(Executor::new()?)) + } + + fn spawn( + &self, + future: impl futures::Future<Output = ()> + Send + 'static, + ) { + let _ = self.0.spawn(future); + } + + fn enter<R>(&self, f: impl FnOnce() -> R) -> R { + self.0.enter(f) + } + } +} + +#[cfg(target_arch = "wasm32")] +mod platform { + use iced_futures::{executor::WasmBindgen, futures, Executor}; + + /// A default cross-platform executor. + /// + /// - On native platforms, it will use `iced_futures::executor::ThreadPool`. + /// - On the Web, it will use `iced_futures::executor::WasmBindgen`. + #[derive(Debug)] + pub struct Default(WasmBindgen); + + impl Executor for Default { + fn new() -> Result<Self, futures::io::Error> { + Ok(Default(WasmBindgen::new()?)) + } + + fn spawn(&self, future: impl futures::Future<Output = ()> + 'static) { + self.0.spawn(future); + } + } +} |