use crossterm::event::{Event as CrosstermEvent, KeyCode, KeyEvent, KeyEventKind, KeyModifiers};
#[derive(Debug, PartialEq, Eq)]
pub enum Event {
MoveLeft,
MoveWordLeft,
MoveRight,
MoveWordRight,
MoveUp,
MoveDown,
MoveToStart,
MoveToEnd,
Backspace,
ClearBefore,
Delete,
ClearAfter,
Quit,
Abort,
Resize(u16, u16),
Insert(char),
Select,
Paste(String),
}
pub fn convert(event: CrosstermEvent) -> Option<Event> {
match event {
CrosstermEvent::Key(KeyEvent {
kind: KeyEventKind::Press,
modifiers: KeyModifiers::NONE,
code,
..
}) => match code {
KeyCode::Esc => Some(Event::Quit),
KeyCode::Up => Some(Event::MoveUp),
KeyCode::Down => Some(Event::MoveDown),
KeyCode::Left => Some(Event::MoveLeft),
KeyCode::Right => Some(Event::MoveRight),
KeyCode::Home => Some(Event::MoveToStart),
KeyCode::End => Some(Event::MoveToEnd),
KeyCode::Char(ch) => Some(Event::Insert(ch)),
KeyCode::Backspace => Some(Event::Backspace),
KeyCode::Enter => Some(Event::Select),
KeyCode::Delete => Some(Event::Delete),
_ => None,
},
CrosstermEvent::Key(KeyEvent {
kind: KeyEventKind::Press,
modifiers: KeyModifiers::CONTROL,
code,
..
}) => match code {
KeyCode::Char('c') => Some(Event::Abort),
KeyCode::Char('g' | 'q') => Some(Event::Quit),
KeyCode::Char('k' | 'p') => Some(Event::MoveUp),
KeyCode::Char('j' | 'n') => Some(Event::MoveDown),
KeyCode::Char('b') => Some(Event::MoveLeft),
KeyCode::Char('f') => Some(Event::MoveRight),
KeyCode::Char('a') => Some(Event::MoveToStart),
KeyCode::Char('e') => Some(Event::MoveToEnd),
KeyCode::Char('h') => Some(Event::Backspace),
KeyCode::Char('u') => Some(Event::ClearBefore),
KeyCode::Char('o') => Some(Event::ClearAfter),
_ => None,
},
CrosstermEvent::Key(KeyEvent {
kind: KeyEventKind::Press,
modifiers: KeyModifiers::ALT,
code,
..
}) => match code {
KeyCode::Char('f') => Some(Event::MoveWordRight),
KeyCode::Char('b') => Some(Event::MoveWordLeft),
_ => None,
},
CrosstermEvent::Key(KeyEvent {
kind: KeyEventKind::Press,
modifiers: KeyModifiers::SHIFT,
code,
..
}) => match code {
KeyCode::Char(ch) => Some(Event::Insert(ch)),
KeyCode::Backspace => Some(Event::Backspace),
KeyCode::Enter => Some(Event::Select),
_ => None,
},
CrosstermEvent::Resize(width, height) => Some(Event::Resize(width, height)),
CrosstermEvent::Paste(contents) => Some(Event::Paste(contents)),
_ => None,
}
}