refactor: implement event handling

This commit is contained in:
Stevan Freeborn
2026-07-28 09:33:03 -05:00
parent 06d8a6fa8a
commit ec61470256
+38
View File
@@ -0,0 +1,38 @@
use crossterm::event::{self, Event, KeyCode, KeyModifiers};
use crate::msg::Message;
pub fn handle_event(event: Event) -> Option<Message> {
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);
}
}