use super::scope::Scope;
use crate::corpus::Corpus;
use crate::corpus::graph::Graph;
use crate::workspace::vcs;
#[derive(Debug, Clone, Default)]
pub struct Options {
pub run_commands: bool,
pub external: bool,
pub online: bool,
pub guards: bool,
pub commands: Vec<String>,
}
pub struct Ctx<'a> {
pub corpus: &'a Corpus,
pub graph: &'a Graph,
pub scope: &'a Scope,
pub opts: &'a Options,
}
impl Ctx<'_> {
pub fn previous(&self, path: &str) -> Option<String> {
let base = self.scope.base.as_deref()?;
vcs::show(&self.corpus.cfg.spec_home, base, path)
}
pub fn current(&self, path: &str) -> Option<String> {
let staged = matches!(self.scope.range, super::scope::Range::Staged);
if staged && !self.scope.in_submodules.contains(path) {
return vcs::show_staged(&self.corpus.cfg.spec_home, path);
}
crate::corpus::overlay::read(&self.corpus.cfg.spec_home.join(path)).ok()
}
}
pub fn key_line(ctx: &Ctx, path: &str, key: &str) -> usize {
let Some(text) = ctx.current(path) else { return 1 };
let prefix = format!("{key}:");
text.lines().position(|l| l.starts_with(&prefix)).map(|i| i + 1).unwrap_or(1)
}