rustact 0.1.0

Async terminal UI framework inspired by React, built on top of ratatui and tokio.
Documentation
use std::sync::Arc;

use crate::events::{EventBus, FrameworkEvent};
use crate::styles::Stylesheet;
use tokio::sync::mpsc;
use tokio::sync::mpsc::error::TrySendError;
use tracing::trace;

#[derive(Clone)]
pub struct Dispatcher {
    tx: mpsc::Sender<AppMessage>,
    event_bus: EventBus,
}

impl Dispatcher {
    pub(crate) fn new(tx: mpsc::Sender<AppMessage>, event_bus: EventBus) -> Self {
        Self { tx, event_bus }
    }

    pub fn request_render(&self) {
        match self.tx.try_send(AppMessage::RequestRender) {
            Ok(_) => trace!("render request queued"),
            Err(TrySendError::Full(_)) => {
                trace!("render request dropped because channel is full")
            }
            Err(TrySendError::Closed(_)) => trace!("render request dropped because channel closed"),
        }
    }

    pub fn events(&self) -> EventBus {
        self.event_bus.clone()
    }
}

#[derive(Clone, Debug)]
pub enum AppMessage {
    RequestRender,
    ExternalEvent(FrameworkEvent),
    Shutdown,
    StylesheetUpdated(Arc<Stylesheet>),
}