summaryrefslogtreecommitdiff
path: root/src/config/keymap/event_from_string.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/config/keymap/event_from_string.rs')
-rw-r--r--src/config/keymap/event_from_string.rs78
1 files changed, 78 insertions, 0 deletions
diff --git a/src/config/keymap/event_from_string.rs b/src/config/keymap/event_from_string.rs
new file mode 100644
index 0000000..00179c5
--- /dev/null
+++ b/src/config/keymap/event_from_string.rs
@@ -0,0 +1,78 @@
+use ratatui::crossterm::event::{KeyCode, KeyEvent, KeyModifiers};
+
+fn parse_key_names(s: &str) -> Option<KeyCode> {
+ if s.chars().count() == 1 {
+ return Some(KeyCode::Char(s.chars().next().unwrap()));
+ }
+
+ match s {
+ "esc" => Some(KeyCode::Esc),
+ "up" => Some(KeyCode::Up),
+ "down" => Some(KeyCode::Down),
+ "left" => Some(KeyCode::Left),
+ "right" => Some(KeyCode::Right),
+ "backspace" => Some(KeyCode::Backspace),
+ "enter" => Some(KeyCode::Enter),
+ "home" => Some(KeyCode::Home),
+ "end" => Some(KeyCode::End),
+ "pageup" => Some(KeyCode::PageUp),
+ "pagedown" => Some(KeyCode::PageDown),
+ "tab" => Some(KeyCode::Tab),
+ "delete" => Some(KeyCode::Delete),
+ "insert" => Some(KeyCode::Insert),
+ "f1" => Some(KeyCode::F(1)),
+ "f2" => Some(KeyCode::F(2)),
+ "f3" => Some(KeyCode::F(3)),
+ "f4" => Some(KeyCode::F(4)),
+ "f5" => Some(KeyCode::F(5)),
+ "f6" => Some(KeyCode::F(6)),
+ "f7" => Some(KeyCode::F(7)),
+ "f8" => Some(KeyCode::F(8)),
+ "f9" => Some(KeyCode::F(9)),
+ "f10" => Some(KeyCode::F(10)),
+ "f11" => Some(KeyCode::F(11)),
+ "f12" => Some(KeyCode::F(12)),
+ "capslock" => Some(KeyCode::CapsLock),
+ "scrolllock" => Some(KeyCode::ScrollLock),
+ "numlock" => Some(KeyCode::NumLock),
+ "printscreen" => Some(KeyCode::PrintScreen),
+ "pause" => Some(KeyCode::Pause),
+ "menu" => Some(KeyCode::Menu),
+ "keypadbegin" => Some(KeyCode::KeypadBegin),
+ _ => None
+ }
+}
+
+pub fn event_from_string(s: String) -> Result<KeyEvent, String> {
+ let mut modifiers = KeyModifiers::NONE;
+ let s = s.to_lowercase();
+
+ let code = if s.chars().count() == 1 {
+ KeyCode::Char(s.chars().next().unwrap())
+ } else if s.starts_with('<') && s.ends_with('>') {
+ let mut inner = &s[1..s.len() - 1];
+
+ loop {
+ if inner.starts_with("c-") {
+ inner = &inner[2..];
+ modifiers |= KeyModifiers::CONTROL;
+ } else if inner.starts_with("a-") {
+ inner = &inner[2..];
+ modifiers |= KeyModifiers::ALT;
+ } else {
+ break;
+ }
+ }
+
+ match parse_key_names(inner) {
+ Some(keycode) => keycode,
+ None => return Err(format!("{:?} is not a valid keyname", inner))
+ }
+ } else {
+ return Err(format!("{:?} is not a valid keyname", s));
+ };
+
+ println!("{:?}", KeyEvent::new(code, modifiers));
+
+ Ok(KeyEvent::new(code, modifiers))
+}