quinjet 0.0.48

A fast, live, keyboard-first Git source-control interface for the terminal
use std::time::Instant;

use super::{RepositoryWorkspace, RoutedEffects};

impl RepositoryWorkspace {
    pub(crate) fn drain_worker_events(&mut self, now: Instant) -> Vec<RoutedEffects> {
        let mut routed = Vec::new();
        for (id, runtime) in self.tabs.iter_mut() {
            let events = runtime.worker.events().try_iter().collect::<Vec<_>>();
            for event in events {
                let effects = runtime.app.handle_worker_event(event, now);
                routed.push(RoutedEffects { id, effects });
            }
        }
        routed
    }

    pub(crate) fn poll_watchers(&mut self) -> Vec<RoutedEffects> {
        let mut routed = Vec::new();
        for (id, runtime) in self.tabs.iter_mut() {
            let Some(receiver) = runtime
                .watcher
                .as_ref()
                .map(crate::watch::RepoWatcher::changes)
            else {
                continue;
            };
            if receiver.try_iter().next().is_none() {
                continue;
            }
            let mut effects = Vec::new();
            runtime.app.filesystem_changed(&mut effects);
            routed.push(RoutedEffects { id, effects });
        }
        routed
    }

    pub(crate) fn tick(&mut self, now: Instant) -> (Vec<RoutedEffects>, bool) {
        let active = self.active_id();
        let mut dirty = false;
        let mut routed = Vec::new();
        for (id, runtime) in self.tabs.iter_mut() {
            let (effects, changed) = runtime.app.tick(now);
            dirty |= changed && active == Some(id);
            routed.push(RoutedEffects { id, effects });
        }
        (routed, dirty)
    }

    pub(crate) fn periodic_refresh(&mut self) -> Vec<RoutedEffects> {
        let mut routed = Vec::new();
        for (id, runtime) in self.tabs.iter_mut() {
            let mut effects = Vec::new();
            runtime.app.periodic_refresh(&mut effects);
            routed.push(RoutedEffects { id, effects });
        }
        routed
    }

    pub(crate) fn webhook_delivered(&mut self, now: Instant) -> Vec<RoutedEffects> {
        self.tabs
            .iter_mut()
            .map(|(id, runtime)| RoutedEffects {
                id,
                effects: runtime.app.webhook_delivered(now),
            })
            .collect()
    }
}