use std::{future::pending, thread};
use console::{Key, Term};
use tokio::sync::mpsc;
pub struct Keyboard {
presses: Option<mpsc::UnboundedReceiver<()>>,
}
impl Keyboard {
pub fn start() -> Self {
let term = Term::stdout();
if !term.is_term() {
return Self { presses: None };
}
let (tx, presses) = mpsc::unbounded_channel();
thread::spawn(move || {
while let Ok(key) = term.read_key() {
if matches!(key, Key::Char('r' | 'R')) && tx.send(()).is_err() {
break;
}
}
});
Self {
presses: Some(presses),
}
}
pub fn is_listening(&self) -> bool {
self.presses.is_some()
}
pub async fn reload_requested(&mut self) {
let press = match &mut self.presses {
Some(presses) => presses.recv().await,
None => None,
};
if press.is_none() {
pending::<()>().await;
}
}
}