summaryrefslogtreecommitdiff
path: root/src/config/keymap/keymap_store.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/config/keymap/keymap_store.rs')
-rw-r--r--src/config/keymap/keymap_store.rs81
1 files changed, 81 insertions, 0 deletions
diff --git a/src/config/keymap/keymap_store.rs b/src/config/keymap/keymap_store.rs
new file mode 100644
index 0000000..c782219
--- /dev/null
+++ b/src/config/keymap/keymap_store.rs
@@ -0,0 +1,81 @@
+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<HashMap<KeyEvent, Arc<Mutex<dyn Runnable>>>>,
+}
+
+impl KeyMapStore {
+ pub const fn new() -> Self {
+ Self { store: None }
+ }
+
+ pub fn get(&mut self, event: KeyEvent) -> Option<Arc<Mutex<dyn Runnable>>> {
+ 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<T> 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")
+ }
+}