diff options
-rw-r--r-- | core/Cargo.toml | 7 | ||||
-rw-r--r-- | core/src/command.rs | 49 | ||||
-rw-r--r-- | core/src/lib.rs | 4 | ||||
-rw-r--r-- | native/Cargo.toml | 2 | ||||
-rw-r--r-- | native/src/lib.rs | 2 |
5 files changed, 62 insertions, 2 deletions
diff --git a/core/Cargo.toml b/core/Cargo.toml index a244bcba..f2492345 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -6,3 +6,10 @@ edition = "2018" description = "The essential concepts of Iced" license = "MIT" repository = "https://github.com/hecrj/iced" + +[features] +# Exposes a future-based `Command` type +command = ["futures"] + +[dependencies] +futures = { version = "0.3", optional = true } diff --git a/core/src/command.rs b/core/src/command.rs new file mode 100644 index 00000000..ae901bd8 --- /dev/null +++ b/core/src/command.rs @@ -0,0 +1,49 @@ +use futures::future::{BoxFuture, Future, FutureExt}; + +pub struct Command<T> { + futures: Vec<BoxFuture<'static, T>>, +} + +impl<T> Command<T> { + pub fn none() -> Self { + Self { + futures: Vec::new(), + } + } + + pub fn attempt<A>( + future: impl Future<Output = T> + 'static + Send, + f: impl Fn(T) -> A + 'static + Send, + ) -> Command<A> { + Command { + futures: vec![future.map(f).boxed()], + } + } + + pub fn batch(commands: impl Iterator<Item = Command<T>>) -> Self { + Self { + futures: commands.flat_map(|command| command.futures).collect(), + } + } + + pub fn futures(self) -> Vec<BoxFuture<'static, T>> { + self.futures + } +} + +impl<T, A> From<A> for Command<T> +where + A: Future<Output = T> + 'static + Send, +{ + fn from(future: A) -> Self { + Self { + futures: vec![future.boxed()], + } + } +} + +impl<T> std::fmt::Debug for Command<T> { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("Command").finish() + } +} diff --git a/core/src/lib.rs b/core/src/lib.rs index b61f2eae..3816f8a2 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -3,6 +3,8 @@ pub mod widget; mod align; mod background; mod color; +#[cfg(feature = "command")] +mod command; mod font; mod length; mod point; @@ -12,6 +14,8 @@ mod vector; pub use align::Align; pub use background::Background; pub use color::Color; +#[cfg(feature = "command")] +pub use command::Command; pub use font::Font; pub use length::Length; pub use point::Point; diff --git a/native/Cargo.toml b/native/Cargo.toml index 38db1610..5dc3ae1a 100644 --- a/native/Cargo.toml +++ b/native/Cargo.toml @@ -8,6 +8,6 @@ license = "MIT" repository = "https://github.com/hecrj/iced" [dependencies] -iced_core = { version = "0.1.0-alpha", path = "../core" } +iced_core = { version = "0.1.0-alpha", path = "../core", features = ["command"] } twox-hash = "1.5" raw-window-handle = "0.3" diff --git a/native/src/lib.rs b/native/src/lib.rs index 7e55064c..bd03ddcd 100644 --- a/native/src/lib.rs +++ b/native/src/lib.rs @@ -216,7 +216,7 @@ mod size; mod user_interface; pub use iced_core::{ - Align, Background, Color, Font, Length, Point, Rectangle, Vector, + Align, Background, Color, Command, Font, Length, Point, Rectangle, Vector, }; pub use element::Element; |