use std::path::Path;
use crate::AppModel;
use crate::boundary::reply::{Reply, WsRow};
use crate::boundary::{Query, dispatch::Deps};
use crate::cli_outbound::Cli;
use crate::nav::tabs::TabBar;
use crate::opslog::{Activity, OPS_TAIL};
fn ask(model: &AppModel, query: &Query, now_unix: i64) -> Option<Reply> {
let deps: Deps = model.boundary_deps(&Cli::new("litany"), &Cli::new("bl"));
model.answer(&deps, query, now_unix).ok()
}
pub(crate) fn ws_rows(model: &AppModel) -> Vec<WsRow> {
model.ws_listing().rows
}
pub(crate) fn notes(model: &AppModel) -> (Option<String>, Option<String>) {
let view = model.ws_listing();
(view.stale, view.growth)
}
pub(crate) fn ws_balls(model: &AppModel, ws: &Path) -> Vec<crate::nav::BoundBall> {
let query = Query::WorkspaceBalls {
workspace: model.snap.ws_name(ws),
};
match ask(model, &query, 0) {
Some(Reply::WorkspaceBalls(rows)) => rows,
_ => Vec::new(),
}
}
pub(crate) fn tab_bar(model: &AppModel, focused: Option<&str>) -> TabBar {
crate::nav::tabs::build(&ws_rows(model), focused)
}
pub(crate) fn activity(model: &AppModel) -> Activity {
match ask(model, &Query::Ops { max: OPS_TAIL }, 0) {
Some(Reply::Ops(rows)) => {
let lines: Vec<_> = rows.into_iter().map(|v| v.row).collect();
crate::opslog::activity(&lines)
}
_ => Activity {
total: 0,
errors: 0,
drifts: 0,
},
}
}