use std::fmt; use std::fmt::{Display, Formatter}; use crossterm::event::{KeyCode, KeyEvent, KeyModifiers}; #[cfg(test)] #[path = "key_tests.rs"] mod key_tests; #[derive(Debug, PartialEq, Eq, Clone, Copy)] pub enum Key { Up, Down, Left, Right, Enter, Esc, Backspace, Home, End, Tab, BackTab, Delete, Ctrl(char), Char(char), Unknown, } impl Display for Key { fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { match *self { Key::Char(c) => write!(f, "<{c}>"), Key::Ctrl(c) => write!(f, ""), Key::Up => write!(f, "<↑>"), Key::Down => write!(f, "<↓>"), Key::Left => write!(f, "<←>"), Key::Right => write!(f, "<→>"), Key::Enter => write!(f, ""), Key::Esc => write!(f, ""), Key::Backspace => write!(f, ""), Key::Home => write!(f, ""), Key::End => write!(f, ""), Key::Tab => write!(f, ""), Key::BackTab => write!(f, ""), Key::Delete => write!(f, ""), _ => write!(f, "<{self:?}>"), } } } impl From for Key { fn from(key_event: KeyEvent) -> Self { match key_event { KeyEvent { code: KeyCode::Up, .. } => Key::Up, KeyEvent { code: KeyCode::Down, .. } => Key::Down, KeyEvent { code: KeyCode::Left, .. } => Key::Left, KeyEvent { code: KeyCode::Right, .. } => Key::Right, KeyEvent { code: KeyCode::Backspace, .. } => Key::Backspace, KeyEvent { code: KeyCode::Home, .. } => Key::Home, KeyEvent { code: KeyCode::End, .. } => Key::End, KeyEvent { code: KeyCode::BackTab, modifiers: KeyModifiers::SHIFT, .. } => Key::BackTab, KeyEvent { code: KeyCode::Tab, .. } => Key::Tab, KeyEvent { code: KeyCode::Delete, .. } => Key::Delete, KeyEvent { code: KeyCode::Enter, .. } => Key::Enter, KeyEvent { code: KeyCode::Esc, .. } => Key::Esc, KeyEvent { code: KeyCode::Char(c), modifiers: KeyModifiers::CONTROL, .. } => Key::Ctrl(c), KeyEvent { code: KeyCode::Char(c), .. } => Key::Char(c), _ => Key::Unknown, } } }