1#[cfg(feature = "winit")]
5use crate::app;
6#[cfg(feature = "single-instance")]
7use crate::dbus_activation;
8
9pub const fn app<M>(message: M) -> Action<M> {
10 Action::App(message)
11}
12#[cfg(feature = "winit")]
13pub const fn cosmic<M>(message: app::Action) -> Action<M> {
14 Action::Cosmic(message)
15}
16
17pub const fn none<M>() -> Action<M> {
18 Action::None
19}
20
21pub const fn surface<M>(action: crate::surface::Action<M>) -> Action<M> {
23 Action::Surface(action)
24}
25
26#[derive(Clone, Debug)]
27#[must_use]
28pub enum Action<M> {
29 App(M),
31 #[cfg(feature = "winit")]
32 Cosmic(app::Action),
34 #[cfg(feature = "single-instance")]
35 DbusActivation(dbus_activation::Message),
37 Surface(crate::surface::Action<M>),
39 None,
41}
42
43impl<M: 'static> Action<M> {
44 #[must_use]
46 pub fn map<N: 'static>(self, f: impl Fn(M) -> N + Clone + Send + Sync + 'static) -> Action<N> {
47 match self {
48 Action::App(message) => Action::App(f(message)),
49 #[cfg(feature = "winit")]
50 Action::Cosmic(action) => Action::Cosmic(action),
51 #[cfg(feature = "single-instance")]
52 Action::DbusActivation(message) => Action::DbusActivation(message),
53 Action::Surface(action) => Action::Surface(action.map(f)),
54 Action::None => Action::None,
55 }
56 }
57}
58
59impl<M: 'static> Action<Action<M>> {
60 #[must_use]
63 pub fn flatten(self) -> Action<M> {
64 match self {
65 Action::App(action) => action,
66 #[cfg(feature = "winit")]
67 Action::Cosmic(action) => Action::Cosmic(action),
68 #[cfg(feature = "single-instance")]
69 Action::DbusActivation(message) => Action::DbusActivation(message),
70 Action::Surface(action) => Action::Surface(action.flatten()),
71 Action::None => Action::None,
72 }
73 }
74}
75
76impl<M> From<M> for Action<M> {
77 fn from(value: M) -> Self {
78 Self::App(value)
79 }
80}