pub use crossterm::event::{self, Event};
use crossterm::event::{poll, KeyCode, KeyEvent, KeyEventKind, KeyModifiers};
use std::time::Duration;
mod raw_mode;
pub use raw_mode::{disable as disable_raw_mode, enable as enable_raw_mode, exit as exit_raw_mode};
#[must_use]
pub fn read() -> Option<Event> {
event::read().ok()
}
#[must_use]
pub fn read_non_blocking() -> Option<Event> {
match poll(Duration::ZERO) {
Ok(true) => read(),
_ => None,
}
}
pub fn exit_if_kb_interrupt(event: &Option<Event>) {
if matches!(
event,
Some(Event::Key(KeyEvent {
code: KeyCode::Char('c'),
modifiers: KeyModifiers::CONTROL,
kind: KeyEventKind::Press,
..
}))
) {
exit_raw_mode();
}
}
#[must_use]
pub fn read_and_handle_kb_interrupt(blocking: bool) -> Option<Event> {
let event = if blocking {
read()
} else {
read_non_blocking()
};
exit_if_kb_interrupt(&event);
event
}