toon_format/tui/
events.rs

1//! Event handling for terminal input.
2
3use std::time::Duration;
4
5use crossterm::event::{
6    self,
7    Event as CrosstermEvent,
8    KeyEvent,
9};
10
11/// TUI events.
12pub enum Event {
13    Key(KeyEvent),
14    Tick,
15    Resize,
16}
17
18pub struct EventHandler;
19
20impl EventHandler {
21    /// Poll for next event with timeout.
22    pub fn poll(timeout: Duration) -> std::io::Result<Option<Event>> {
23        if event::poll(timeout)? {
24            match event::read()? {
25                CrosstermEvent::Key(key) => Ok(Some(Event::Key(key))),
26                CrosstermEvent::Resize(_, _) => Ok(Some(Event::Resize)),
27                _ => Ok(None),
28            }
29        } else {
30            Ok(Some(Event::Tick))
31        }
32    }
33}