use crossterm::cursor::{Hide, Show};
use crossterm::event::{self, Event, KeyEvent};
use crossterm::{execute, terminal};
use flume::{Receiver, Sender};
use std::time::Duration;
pub struct InReader {
tx: Sender<KeyEvent>,
}
impl InReader {
pub fn new_and_rx() -> (Self, Receiver<KeyEvent>) {
let (tx, rx) = flume::unbounded::<KeyEvent>();
(Self { tx }, rx)
}
}
impl InReader {
pub fn start(&self) {
let tx = self.tx.clone();
terminal::enable_raw_mode().expect("Failed to enable crossterm raw mode");
execute!(std::io::stdout(), Hide).expect("Failed to hide the cursor");
tokio::spawn(async move {
loop {
if event::poll(Duration::from_millis(100)).expect("Could not read/poll stdin") {
if let Ok(Event::Key(key_event)) = event::read() {
if let Err(err) = tx.send_async(key_event).await {
println!("InReader ERROR - sending key_event - {err}");
};
}
}
tokio::task::yield_now().await;
}
});
}
pub fn close(&self) {
terminal::disable_raw_mode().expect("Failed to disable crossterm raw mode");
execute!(std::io::stdout(), Show).expect("Failed to show the cursor");
}
}