macro_rules! KeyMapSections { ($($name:ident => $key:ident),+ $(,)?) => { $( #[derive(Debug, Default, Clone)] pub struct $name { store: KeyMapStore, } impl $name { pub const fn new() -> Self { Self { store: KeyMapStore::new(), } } pub fn handle(event: KeyEvent) -> Option { let func = { GlobalConfig::instance_mut().keymap.$key.store.get(event) }; if let Some(func) = func { let func = func.lock().unwrap(); match func.run() { Ok(value) => Some(value), _ => None } } else { None } } pub fn map(event: KeyEvent, func: impl Runnable + 'static) { GlobalConfig::instance_mut() .keymap .$key .store .map(event, func) } } impl UserData for $name { fn add_methods<'lua, M: mlua::prelude::LuaUserDataMethods<'lua, Self>>( methods: &mut M, ) { methods.add_function("map", |lua, (event, func): (String, Function<'_>)| { let key = lua.create_registry_value(func)?; if let Ok(event) = event_from_string(event) { $name::map(event, key); } Ok(()) }); } } )* }; } pub(super) use KeyMapSections;