use crossterm::event as crossterm_event;
use std::{io::Result as CrosstermResult, time::Duration};
#[derive(Debug, Clone)]
pub enum Event {
Key(crossterm_event::KeyEvent),
Mouse(crossterm_event::MouseEvent),
Resize(u16, u16),
Timeout,
}
pub trait EventHandler {
fn handle(&mut self, event: &Event) -> bool;
}
pub struct EventSource {
tick_rate: Duration,
}
impl EventSource {
pub fn new(tick_rate: Duration) -> Self {
Self { tick_rate }
}
pub fn next(&self) -> CrosstermResult<Event> {
if crossterm_event::poll(self.tick_rate)? {
match crossterm_event::read()? {
crossterm_event::Event::Key(key) => Ok(Event::Key(key)),
crossterm_event::Event::Mouse(mouse) => Ok(Event::Mouse(mouse)),
crossterm_event::Event::Resize(width, height) => Ok(Event::Resize(width, height)),
_ => Ok(Event::Timeout),
}
}
else {
Ok(Event::Timeout)
}
}
}