From ec614702564ab83330b5f563099ce5153fd4ce2a Mon Sep 17 00:00:00 2001 From: Stevan Freeborn Date: Tue, 28 Jul 2026 09:33:03 -0500 Subject: [PATCH] refactor: implement event handling --- src/events.rs | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 src/events.rs 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); + } +}