use std::path::Path;
use std::sync::Arc;
use crate::AppModel;
use crate::files_view::Preview;
use crate::keymap::InspectorTab;
use crate::workdiff::{self, Attempt, WorkFile};
use super::super::InspectorState;
pub fn build(
tab: InspectorTab,
model: &AppModel,
inspector: &mut InspectorState,
ws: &Path,
) -> Vec<Attempt> {
if tab != InspectorTab::Work {
return Vec::new();
}
let snap = Arc::clone(model.derivation());
inspector
.work_memo
.read(&snap, ws.to_path_buf(), &mut || workdiff::read(&snap, ws))
.clone()
}
pub fn patch(
model: &AppModel,
inspector: &mut InspectorState,
ws: &Path,
attempts: &[Attempt],
picked: Option<&WorkFile>,
) -> Option<Preview> {
let snap = Arc::clone(model.derivation());
let key = (ws.to_path_buf(), picked.cloned());
inspector
.work_patch_memo
.read(&snap, key, &mut || {
picked.and_then(|file| workdiff::patch(attempts, file))
})
.clone()
}