use super::JumpRecord;
use crate::editor::git_memory::{CommitFiles, HunkOrigin};
use strop_git::memory::LogRow;
use strop_git::Hunk;
#[derive(Debug, Clone)]
pub enum DocumentSource {
File,
Scratch,
Remote(Box<super::RemoteDocument>),
Directory(Box<super::Directory>),
Container {
container: strop_workspace::ContainerId,
path: std::path::PathBuf,
},
Surface(Box<GitSurface>),
Output { return_to: Option<JumpRecord> },
}
#[derive(Debug, Clone)]
pub struct GitSurface {
pub context: strop_git::GitContext,
pub content: Surface,
}
#[derive(Debug, Clone)]
pub enum Surface {
CommitLog {
rows: Vec<LogRow>,
focus: Option<String>,
return_to: Option<JumpRecord>,
},
ChangedFiles {
sha: String,
files: crate::editor::git_memory::PreparedFiles,
return_to: Option<JumpRecord>,
},
Diff {
hunks: crate::editor::git_memory::PreparedDiff,
origin: Option<HunkOrigin>,
commit: Option<CommitFiles>,
sidebar_focus: bool,
return_to: Option<JumpRecord>,
},
}
pub enum DiffRow<'a> {
Stats,
HunkHeader(&'a Hunk),
Line(&'a strop_git::DiffLine),
}
impl Surface {
pub fn diff_row(&self, row: usize) -> Option<DiffRow<'_>> {
let Surface::Diff { hunks, .. } = self else {
return None;
};
hunks.row(row)
}
pub(crate) fn set_return_point(&mut self, ret: JumpRecord) {
*self.return_slot() = Some(ret);
}
pub(crate) fn return_point(&self) -> Option<&JumpRecord> {
match self {
Surface::CommitLog { return_to, .. }
| Surface::ChangedFiles { return_to, .. }
| Surface::Diff { return_to, .. } => return_to.as_ref(),
}
}
pub(crate) fn return_slot(&mut self) -> &mut Option<JumpRecord> {
match self {
Surface::CommitLog { return_to, .. }
| Surface::ChangedFiles { return_to, .. }
| Surface::Diff { return_to, .. } => return_to,
}
}
}