use std::sync::mpsc::SyncSender;
use crossterm::event::KeyEventKind;
use super::Show;
pub(super) fn read_keys(to: SyncSender<Show>) {
std::thread::spawn(move || {
loop {
let show = match crossterm::event::read() {
Ok(crossterm::event::Event::Key(key)) if key.kind != KeyEventKind::Release => {
Show::Key(key)
}
Ok(crossterm::event::Event::Paste(pasted)) => Show::Paste(pasted),
Ok(crossterm::event::Event::Resize(..)) => Show::Resized,
Ok(_) => continue,
Err(_) => Show::Lost,
};
let lost = matches!(show, Show::Lost);
if to.send(show).is_err() || lost {
return;
}
}
});
}
pub(super) fn read_records(
to: SyncSender<Show>,
mut watching: tokio::sync::broadcast::Receiver<wire::Committed>,
) {
use tokio::sync::broadcast::error::RecvError;
std::thread::spawn(move || {
loop {
let show = match watching.blocking_recv() {
Ok(committed) => Show::Record(committed),
Err(RecvError::Lagged(missed)) => Show::Line(format!(
" {missed} records were not shown here; the WebUI has them"
)),
Err(RecvError::Closed) => return,
};
drop(to.try_send(show));
}
});
}