use super::super::desired_watches;
use super::super::dirty::Sweep;
use super::super::drift::{self, Drift};
use super::super::snapshot::Snapshot;
use super::Deriver;
use crate::state::{lock_watchset, publish_snapshot};
use crate::watch::Mark;
use std::path::PathBuf;
use std::sync::Arc;
impl Deriver {
pub(in crate::app) fn boot(&mut self) {
self.adopt_cadence();
self.workspaces = crate::binding::workspaces(&self.roots.yog_data, &self.roots.litany_data);
lock_watchset(&self.watches).reconcile(&desired_watches(&self.roots, &self.workspaces));
let paths: Vec<PathBuf> = self.workspaces.iter().map(|w| w.path.clone()).collect();
for path in paths {
self.rederive(&path);
}
self.refresh_balls();
self.refresh_ops();
self.publish();
}
pub fn step(&mut self) -> bool {
let started = self.clock.now();
self.changed = false;
self.growth.clear();
self.ui_bytes = None;
let delivered = self.dirty.drain();
let mut found: Vec<Drift> = delivered
.iter()
.filter(|(_, mark)| **mark == Mark::Desync)
.map(|(root, _)| Drift::Desync(root.clone()))
.collect();
self.dispatch_dirty(delivered);
let sweep = self.schedule.sweep();
match sweep {
Sweep::Full => found.extend(self.full_sweep()),
Sweep::Cheap => found.extend(self.cheap_sweep()),
Sweep::None => {}
}
for (root, mark) in self.schedule.due() {
let baseline = self.trees.contains_key(&root);
if mark == Mark::Watch || mark == Mark::Desync {
self.refresh_liveness(&root);
}
if self.rederive(&root) && mark == Mark::Sweep && baseline {
found.push(Drift::Unannounced(root));
}
}
let late = drift::lateness(started, self.clock.now(), self.cadence.late_pass(sweep));
if let Some(secs) = drift::late_edge(late, self.late) {
found.push(Drift::Late(self.roots.yog_state.clone(), secs));
}
self.late = late.is_some();
self.report_drift(&found);
let publish = self.changed || sweep == Sweep::Full;
if publish {
self.publish();
}
publish
}
pub(in crate::app) fn publish(&mut self) {
publish_snapshot(
&self.cell,
Arc::new(Snapshot {
workspaces: self.workspaces.clone(),
projects: self.projects.clone(),
trees: crate::monitor::flag::fold(self.trees.clone(), &self.ops),
bills: self.bills.clone(),
balls_by_project: self.balls_by_project.clone(),
closed_by_project: self.closed_by_project.clone(),
join_rows: self.join_rows.clone(),
ops: self.ops.clone(),
growth: std::mem::take(&mut self.growth),
ui_bytes: self.ui_bytes.take(),
derived_at_unix: self.clock.unix(),
cadence: self.cadence,
fleet: self.fleet.clone(),
}),
);
}
}