use crate::AppModel;
use crate::boundary::Query;
use crate::boundary::reply::Reply;
use crate::files_view::Preview;
use crate::keymap::InspectorTab;
use crate::shell::wire::Said;
use crate::workdiff::WorkFile;
use std::path::Path;
#[derive(Default)]
pub(super) struct Work {
pub(super) science: Vec<crate::science::Attempt>,
pub(super) patch: Option<Preview>,
}
pub(super) fn read(
tab: InspectorTab,
model: &mut AppModel,
ws: &Path,
picked: Option<WorkFile>,
said: &mut Said,
) -> Work {
if tab != InspectorTab::Work {
return Work::default();
}
let science = Query::Science {
workspace: model.snap.ws_name(ws),
};
let landed = crate::shell::wire::ask(model, science, |reply| match reply {
Reply::Science(rows) => Some(rows),
_ => None,
});
let rows = said.take(landed).unwrap_or_default();
let patch = picked.and_then(|file| {
let query = Query::WorkDiff {
workspace: model.snap.ws_name(ws),
file: Some(file),
};
let landed = crate::shell::wire::ask(model, query, |reply| match reply {
Reply::WorkDiff { patch, .. } => Some(patch),
_ => None,
});
said.take(landed).flatten()
});
Work {
science: rows,
patch,
}
}