use core::fmt; use std::{ collections::HashMap, sync::{Arc, Mutex}, }; use mlua::{Function, RegistryKey, Result}; use ratatui::crossterm::event::KeyEvent; use crate::lua; #[derive(Default, Clone)] pub struct KeyMapStore { store: Option>>>, } impl KeyMapStore { pub const fn new() -> Self { Self { store: None } } pub fn get(&mut self, event: KeyEvent) -> Option>> { match &self.store { Some(store) => match store.get(&event) { Some(func) => Some(Arc::clone(func)), None => None, }, None => { self.store = Some(HashMap::new()); None } } } pub fn map(&mut self, event: KeyEvent, func: impl Runnable + 'static) { match &self.store { Some(_) => {} None => self.store = Some(HashMap::new()), } if let Some(store) = &mut self.store { store.insert(event, Arc::new(Mutex::new(func))); } } } pub trait Runnable where Self: Send, { fn run(&self) -> Result<()>; } impl Runnable for T where T: Fn(), Self: Send, { fn run(&self) -> Result<()> { self(); Ok(()) } } impl Runnable for RegistryKey where Self: Send, { fn run(&self) -> Result<()> { let lua = lua::get(); let func: Function = lua.registry_value(self)?; func.call::<(), ()>(())?; Ok(()) } } impl fmt::Debug for KeyMapStore { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "KeyMapStore") } }