use std::time::Duration;
use crossterm::event::{self, Event, KeyCode, KeyEvent, KeyModifiers};
use crate::error::AppResult;
#[derive(Debug, Clone)]
pub enum AppEvent {
Tick,
Key(KeyEvent),
#[allow(dead_code)] Resize(u16, u16),
}
pub fn next_event(timeout: Duration) -> AppResult<AppEvent> {
if event::poll(timeout).map_err(|e| crate::error::AppError::Io(e))? {
match event::read().map_err(|e| crate::error::AppError::Io(e))? {
Event::Key(k) => return Ok(AppEvent::Key(k)),
Event::Resize(w, h) => return Ok(AppEvent::Resize(w, h)),
_ => {}
}
}
Ok(AppEvent::Tick)
}
pub fn is_quit(key: &KeyEvent) -> bool {
matches!(
key.code,
KeyCode::Char('q')
) || matches!(
(key.code, key.modifiers),
(KeyCode::Char('c'), KeyModifiers::CONTROL)
)
}