diff --git a/src/events.rs b/src/events.rs new file mode 100644 index 0000000..57af44f --- /dev/null +++ b/src/events.rs @@ -0,0 +1,38 @@ +use crossterm::event::{self, Event, KeyCode, KeyModifiers}; +use crate::msg::Message; + +pub fn handle_event(event: Event) -> Option { + if let Event::Key(key) = event + && key.kind == event::KeyEventKind::Press + { + match key.code { + KeyCode::Char('q') | KeyCode::Char('Q') => Some(Message::Quit), + KeyCode::Char('c') if key.modifiers.contains(KeyModifiers::CONTROL) => Some(Message::Quit), + KeyCode::Char(' ') => Some(Message::ToggleRunning), + KeyCode::Char('s') | KeyCode::Char('S') => Some(Message::ToggleMode), + KeyCode::Char('r') | KeyCode::Char('R') => Some(Message::Reset), + KeyCode::Char('?') => Some(Message::ToggleHelp), + _ => None, + } + } else { + None + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crossterm::event::KeyEvent; + + #[test] + fn handle_event_when_called_maps_key_presses_to_messages() { + let key_event = Event::Key(KeyEvent::new(KeyCode::Char(' '), KeyModifiers::NONE)); + assert_eq!(handle_event(key_event), Some(Message::ToggleRunning)); + + let key_event_q = Event::Key(KeyEvent::new(KeyCode::Char('q'), KeyModifiers::NONE)); + assert_eq!(handle_event(key_event_q), Some(Message::Quit)); + + let key_event_unknown = Event::Key(KeyEvent::new(KeyCode::Char('z'), KeyModifiers::NONE)); + assert_eq!(handle_event(key_event_unknown), None); + } +}