summaryrefslogtreecommitdiffstats
path: root/native/src/command/action.rs
diff options
context:
space:
mode:
Diffstat (limited to 'native/src/command/action.rs')
-rw-r--r--native/src/command/action.rs46
1 files changed, 46 insertions, 0 deletions
diff --git a/native/src/command/action.rs b/native/src/command/action.rs
new file mode 100644
index 00000000..77be1b59
--- /dev/null
+++ b/native/src/command/action.rs
@@ -0,0 +1,46 @@
+use crate::clipboard;
+use crate::window;
+
+use std::fmt;
+
+/// An action that a [`Command`] can perform.
+///
+/// [`Command`]: crate::Command
+pub enum Action<T> {
+ /// Run a [`Future`] to completion.
+ Future(iced_futures::BoxFuture<T>),
+
+ /// Run a clipboard action.
+ Clipboard(clipboard::Action<T>),
+
+ /// Run a window action.
+ Window(window::Action),
+}
+
+impl<T> Action<T> {
+ /// Applies a transformation to the result of a [`Command`].
+ pub fn map<A>(self, f: impl Fn(T) -> A + 'static + Send + Sync) -> Action<A>
+ where
+ T: 'static,
+ {
+ use iced_futures::futures::FutureExt;
+
+ match self {
+ Self::Future(future) => Action::Future(Box::pin(future.map(f))),
+ Self::Clipboard(action) => Action::Clipboard(action.map(f)),
+ Self::Window(window) => Action::Window(window),
+ }
+ }
+}
+
+impl<T> fmt::Debug for Action<T> {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ match self {
+ Self::Future(_) => write!(f, "Action::Future"),
+ Self::Clipboard(action) => {
+ write!(f, "Action::Clipboard({:?})", action)
+ }
+ Self::Window(action) => write!(f, "Action::Window({:?})", action),
+ }
+ }
+}