alpaca-trader-rs 0.6.0

Alpaca Markets trading toolkit — async REST client library and interactive TUI trading terminal
Documentation
use crossterm::event::{Event as CEvent, EventStream};
use futures::StreamExt;
use tokio::sync::mpsc::Sender;
use tokio_util::sync::CancellationToken;

use crate::events::Event as AppEvent;

pub async fn run(tx: Sender<AppEvent>, cancel: CancellationToken) {
    let mut stream = EventStream::new();
    loop {
        tokio::select! {
            Some(Ok(evt)) = stream.next() => {
                let event: Option<AppEvent> = match evt {
                    CEvent::Key(k) => Some(AppEvent::Input(k)),
                    CEvent::Mouse(m) => Some(AppEvent::Mouse(m)),
                    CEvent::Resize(w, h) => Some(AppEvent::Resize(w, h)),
                    _ => None,
                };
                if let Some(e) = event {
                    if tx.send(e).await.is_err() { break; }
                }
            }
            _ = cancel.cancelled() => break,
        }
    }
}