use ratatui::crossterm::event::{KeyCode, KeyEvent, KeyModifiers}; fn parse_key_names(s: &str) -> Option { 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 { 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)) }