use std::path::PathBuf;
use crate::context;
use crate::{Config, InitScriptDiscovery, Result, Worktree, WorktreeOptions};
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct StatusOptions {
pub cwd: Option<PathBuf>,
pub root: Option<PathBuf>,
pub config: Option<PathBuf>,
pub no_init_script: bool,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum InitScriptStatus {
Skipped,
Missing {
ignored: Vec<PathBuf>,
},
Found {
path: PathBuf,
},
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct StatusReport {
pub context: Worktree,
pub init_script: InitScriptStatus,
pub config: Option<PathBuf>,
}
pub fn inspect_status(options: StatusOptions) -> Result<StatusReport> {
let context = context::resolve(&WorktreeOptions {
cwd: options.cwd,
root: options.root,
})?;
let init_script = if options.no_init_script || options.config.is_some() {
InitScriptStatus::Skipped
} else {
inspect_init_script(&context)
};
let config = Config::discover_path(&context, options.config.as_deref())?;
Ok(StatusReport {
context,
init_script,
config,
})
}
fn inspect_init_script(context: &Worktree) -> InitScriptStatus {
let scripts = InitScriptDiscovery::discover(context);
if let Some(path) = scripts.executable {
InitScriptStatus::Found { path }
} else {
InitScriptStatus::Missing {
ignored: scripts.ignored,
}
}
}