aura-gui 0.2.2

UI nativa acelerada por GPU para escritorio, Android e iOS, en un solo crate: estilo tipo Tailwind, componentes, sombras, animaciones y agentes de IA. Reposo a cero. Licencia AGPL-3.0 o comercial.
//! Acciones con nombre y un registro de atajos de teclado.

use std::collections::HashMap;

/// Una acción es un identificador estático, por ejemplo `"editor::Copy"`.
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub struct Action(pub &'static str);

/// Declara un catálogo de acciones (patrón Command), como `actions!` de GPUI.
///
/// ```
///
/// aura_ui::core::actions! {
///     GUARDAR = "editor::Save" => "Archivo: Guardar";
///     COPIAR = "editor::Copy";
/// }
/// assert_eq!(ALL.len(), 2);
/// assert_eq!(PALETTE, &[("Archivo: Guardar", GUARDAR)]);
/// ```
///
/// Genera una constante por acción, `ALL` (para traducir los nombres de un
/// `keymap.json`) y `PALETTE` con las que llevan etiqueta para la paleta.
#[macro_export]
macro_rules! actions {
    ($($name:ident = $id:literal $(=> $label:literal)?;)*) => {
        $( pub const $name: $crate::core::Action = $crate::core::Action($id); )*

        /// Todas las acciones, para traducir los nombres de `keymap.json`.
        pub const ALL: &[$crate::core::Action] = &[$($name,)*];

        /// `(etiqueta, acción)` de las que se muestran en la paleta.
        pub const PALETTE: &[(&str, $crate::core::Action)] = &[$($(($label, $name),)?)*];
    };
}

/// Así también se escribe `aura_ui::core::actions!`, además de `aura_ui::actions!`.
pub use crate::actions;

#[derive(Default)]
pub struct ActionRegistry {
    bindings: HashMap<String, Action>,
}

impl ActionRegistry {
    pub fn bind(&mut self, keystroke: impl Into<String>, action: Action) {
        self.bindings.insert(keystroke.into(), action);
    }

    pub fn resolve(&self, keystroke: &str) -> Option<Action> {
        self.bindings.get(keystroke).copied()
    }
}