feat: refactor architecture #4
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user