use crossterm::event::{KeyCode, KeyEvent};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Action {
Quit,
NextIteration,
PrevIteration,
ScrollDown,
ScrollUp,
ScrollTop,
ScrollBottom,
StartSearch,
SearchNext,
SearchPrev,
ShowHelp,
DismissHelp,
None,
}
pub fn map_key(key: KeyEvent) -> Action {
match key.code {
KeyCode::Char('q') => Action::Quit,
KeyCode::Right | KeyCode::Char('l') => Action::NextIteration,
KeyCode::Left | KeyCode::Char('h') => Action::PrevIteration,
KeyCode::Down | KeyCode::Char('j') => Action::ScrollDown,
KeyCode::Up | KeyCode::Char('k') => Action::ScrollUp,
KeyCode::Char('g') => Action::ScrollTop,
KeyCode::Char('G') => Action::ScrollBottom,
KeyCode::Char('/') => Action::StartSearch,
KeyCode::Char('n') => Action::SearchNext,
KeyCode::Char('N') => Action::SearchPrev,
KeyCode::Char('?') => Action::ShowHelp,
KeyCode::Esc => Action::DismissHelp,
_ => Action::None,
}
}
#[cfg(test)]
mod tests {
use super::*;
use crossterm::event::KeyModifiers;
#[test]
fn q_returns_quit() {
let key = KeyEvent::new(KeyCode::Char('q'), KeyModifiers::NONE);
assert_eq!(map_key(key), Action::Quit);
}
#[test]
fn right_arrow_returns_next_iteration() {
let key = KeyEvent::new(KeyCode::Right, KeyModifiers::NONE);
assert_eq!(map_key(key), Action::NextIteration);
}
#[test]
fn left_arrow_returns_prev_iteration() {
let key = KeyEvent::new(KeyCode::Left, KeyModifiers::NONE);
assert_eq!(map_key(key), Action::PrevIteration);
}
#[test]
fn j_returns_scroll_down() {
let key = KeyEvent::new(KeyCode::Char('j'), KeyModifiers::NONE);
assert_eq!(map_key(key), Action::ScrollDown);
}
#[test]
fn k_returns_scroll_up() {
let key = KeyEvent::new(KeyCode::Char('k'), KeyModifiers::NONE);
assert_eq!(map_key(key), Action::ScrollUp);
}
#[test]
fn g_returns_scroll_top() {
let key = KeyEvent::new(KeyCode::Char('g'), KeyModifiers::NONE);
assert_eq!(map_key(key), Action::ScrollTop);
}
#[test]
fn shift_g_returns_scroll_bottom() {
let key = KeyEvent::new(KeyCode::Char('G'), KeyModifiers::SHIFT);
assert_eq!(map_key(key), Action::ScrollBottom);
}
#[test]
fn slash_returns_start_search() {
let key = KeyEvent::new(KeyCode::Char('/'), KeyModifiers::NONE);
assert_eq!(map_key(key), Action::StartSearch);
}
#[test]
fn n_returns_search_next() {
let key = KeyEvent::new(KeyCode::Char('n'), KeyModifiers::NONE);
assert_eq!(map_key(key), Action::SearchNext);
}
#[test]
fn shift_n_returns_search_prev() {
let key = KeyEvent::new(KeyCode::Char('N'), KeyModifiers::SHIFT);
assert_eq!(map_key(key), Action::SearchPrev);
}
#[test]
fn question_mark_returns_show_help() {
let key = KeyEvent::new(KeyCode::Char('?'), KeyModifiers::SHIFT);
assert_eq!(map_key(key), Action::ShowHelp);
}
#[test]
fn esc_returns_dismiss_help() {
let key = KeyEvent::new(KeyCode::Esc, KeyModifiers::NONE);
assert_eq!(map_key(key), Action::DismissHelp);
}
#[test]
fn l_returns_next_iteration() {
let key = KeyEvent::new(KeyCode::Char('l'), KeyModifiers::NONE);
assert_eq!(map_key(key), Action::NextIteration);
}
#[test]
fn h_returns_prev_iteration() {
let key = KeyEvent::new(KeyCode::Char('h'), KeyModifiers::NONE);
assert_eq!(map_key(key), Action::PrevIteration);
}
#[test]
fn unknown_key_returns_none() {
let key = KeyEvent::new(KeyCode::Char('x'), KeyModifiers::NONE);
assert_eq!(map_key(key), Action::None);
}
#[test]
fn down_arrow_returns_scroll_down() {
let key = KeyEvent::new(KeyCode::Down, KeyModifiers::NONE);
assert_eq!(map_key(key), Action::ScrollDown);
}
#[test]
fn up_arrow_returns_scroll_up() {
let key = KeyEvent::new(KeyCode::Up, KeyModifiers::NONE);
assert_eq!(map_key(key), Action::ScrollUp);
}
}