use crossterm::event::{self, Event as CrosstermEvent, KeyEvent};
use std::time::Duration;
use crate::error::Result;
#[derive(Debug)]
pub enum Event {
Key(KeyEvent),
#[allow(dead_code)]
Resize(u16, u16),
}
pub struct EventHandler {
timeout: Duration,
}
impl EventHandler {
pub fn new(timeout_ms: u64) -> Self {
EventHandler {
timeout: Duration::from_millis(timeout_ms),
}
}
pub fn poll(&mut self) -> Result<Event> {
if event::poll(self.timeout)? {
match event::read()? {
CrosstermEvent::Key(key) => Ok(Event::Key(key)),
CrosstermEvent::Resize(w, h) => Ok(Event::Resize(w, h)),
_ => self.poll(), }
} else {
Ok(Event::Resize(0, 0))
}
}
}