1use anyhow::Result;
4use crossterm::event::{self, Event as CrosstermEvent, KeyEvent};
5use std::time::Duration;
6
7#[derive(Debug, Clone)]
9pub enum Event {
10 Key(KeyEvent),
12 Resize(u16, u16),
14 Tick,
16}
17
18pub struct EventHandler {
20 tick_rate: Duration,
21}
22
23impl EventHandler {
24 pub fn new(tick_rate: Duration) -> Self {
26 Self {
27 tick_rate,
28 }
29 }
30
31 pub fn next(&self) -> Result<Event> {
36 if event::poll(self.tick_rate)? {
37 match event::read()? {
38 CrosstermEvent::Key(key) => Ok(Event::Key(key)),
39 CrosstermEvent::Resize(w, h) => Ok(Event::Resize(w, h)),
40 _ => Ok(Event::Tick),
42 }
43 } else {
44 Ok(Event::Tick)
45 }
46 }
47}