use super::Deriver;
use crate::watch::Mark;
use std::collections::BTreeMap;
use std::path::{Path, PathBuf};
impl Deriver {
pub(super) fn dispatch_dirty(&mut self, roots: BTreeMap<PathBuf, Mark>) {
let mut workspaces = Vec::new();
for (root, mark) in roots {
if root == self.roots.yog_state {
self.adopt_ui();
self.adopt_cadence();
self.refresh_ops();
} else if self.roots.balls_clones.contains(&root) {
self.refresh_balls();
} else if self.projects.contains(&root) {
self.refetch_project(&root);
} else if self.is_enum_root(&root) {
self.reconcile(Mark::Watch);
} else {
workspaces.push((root, mark));
}
}
self.schedule.mark(workspaces);
}
fn is_enum_root(&self, root: &Path) -> bool {
root == self.roots.names()
|| root == self.roots.workspaces()
|| root == self.roots.replays()
}
fn adopt_ui(&mut self) {
let Ok(bytes) = std::fs::read(self.roots.ui_json()) else {
return;
};
self.ui_bytes = Some(bytes);
self.changed = true;
}
pub(super) fn adopt_cadence(&mut self) {
let text =
std::fs::read_to_string(self.roots.yog_state.join(crate::app::cadence::CADENCE_YAML))
.unwrap_or_default();
let next = crate::app::cadence::parse(&text);
if next != self.cadence {
self.cadence = next;
self.schedule.set_cadence(next);
self.changed = true;
}
let fleet: std::collections::BTreeMap<String, crate::fleet::Policy> =
crate::fleet::arming::armed(&text)
.into_iter()
.filter_map(|key| {
let policy = crate::fleet::arming::policy(&text, &key)?;
Some((key, policy))
})
.collect();
if fleet != self.fleet {
self.fleet = fleet;
self.changed = true;
}
}
}