pagetop/core/
action.rs

1//! API para definir acciones que inyectan código en el flujo de la aplicación.
2//!
3//! Permite crear acciones para que otros *crates* puedan inyectar código usando funciones *ad hoc*
4//! que modifican el comportamiento predefinido en puntos concretos del flujo de ejecución de la
5//! aplicación.
6
7mod definition;
8pub use definition::{ActionBox, ActionDispatcher, ActionKey};
9
10mod list;
11use list::ActionsList;
12
13mod all;
14pub(crate) use all::add_action;
15pub use all::dispatch_actions;
16
17/// Facilita la implementación del método [`actions()`](crate::core::extension::Extension::actions).
18///
19/// Evita escribir repetidamente `Box::new(...)` para cada acción de la lista, manteniendo el código
20/// más limpio.
21///
22/// # Ejemplo
23///
24/// ```rust,ignore
25/// use pagetop::prelude::*;
26///
27/// impl Extension for MyTheme {
28///     fn actions(&self) -> Vec<ActionBox> {
29///         actions_boxed![
30///             action::theme::BeforeRender::<Button>::new(&Self, before_render_button),
31///             action::theme::PrepareRender::<Error404>::new(&Self, render_error404),
32///         ]
33///     }
34/// }
35///
36/// impl Theme for MyTheme {}
37///
38/// fn before_render_button(c: &mut Button, cx: &mut Context) { todo!() }
39/// fn render_error404(c: &Error404, cx: &mut Context) -> PrepareMarkup { todo!() }
40/// ```
41#[macro_export]
42macro_rules! actions_boxed {
43    () => {
44        Vec::<ActionBox>::new()
45    };
46    ( $($action:expr),+ $(,)? ) => {{
47        vec![$(Box::new($action),)+]
48    }};
49}