use super::Deriver;
use crate::opslog::{self, OpRow};
use crate::projects;
use crate::projects::join;
use std::path::{Path, PathBuf};
impl Deriver {
pub(super) fn refresh_balls(&mut self) {
let all = projects::enumerate(&self.roots.balls_clones);
self.projects = all.iter().map(|p| p.path.clone()).collect();
let visible: Vec<PathBuf> = projects::visible(&all)
.into_iter()
.map(|p| p.path.clone())
.collect();
self.balls_by_project = visible
.iter()
.filter_map(|p| Some((p.clone(), self.balls.live(p).ok()?)))
.collect();
self.rebuild_join(&visible);
}
pub(super) fn refetch_project(&mut self, project: &Path) {
let live = self.balls.live(project).unwrap_or_default();
let closed = self.balls.closed(project).unwrap_or_default();
self.balls_by_project.insert(project.to_path_buf(), live);
self.closed_by_project.insert(project.to_path_buf(), closed);
let cloned: Vec<PathBuf> = self.balls_by_project.keys().cloned().collect();
self.rebuild_join(&cloned);
self.refresh_ops();
}
pub(super) fn rebuild_join(&mut self, cloned: &[PathBuf]) {
let rows = join::join(
&self.projects,
cloned,
&self.balls_by_project,
&self.closed_by_project,
&self.workspaces,
);
if rows != self.join_rows {
self.join_rows = rows;
self.changed = true;
}
}
pub(super) fn refresh_ops(&mut self) {
let root = self.roots.yog_state.clone();
let now = self.clock.unix();
let grace = self.cadence.wound_grace();
let rows: Vec<OpRow> = opslog::tail(&root, opslog::OPS_TAIL)
.iter()
.map(|entry| {
if opslog::launch::stillborn(&self.trees, entry, now, grace) {
OpRow::from(&opslog::detached::fold(&root, entry))
} else {
OpRow::from(entry)
}
})
.collect();
if rows != self.ops {
self.ops = rows;
self.changed = true;
}
}
}