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