use std::path::PathBuf;
use serde::Serialize;
use crate::check::WorktreeSnapshot;
use crate::context;
use crate::{
Config, EnvironmentInput, IgnoredInitScript, InitScriptDiscovery, Result, Worktree,
WorktreeOptions,
};
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct StatusOptions {
pub cwd: Option<PathBuf>,
pub root: Option<PathBuf>,
pub environment: EnvironmentInput,
pub config: Option<PathBuf>,
pub no_init_script: bool,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
#[serde(tag = "status", rename_all = "snake_case")]
pub enum InitScriptStatus {
Skipped,
NotFound {
ignored: Vec<IgnoredInitScript>,
},
Found {
path: PathBuf,
},
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct StatusReport {
pub context: Worktree,
pub init_script: InitScriptStatus,
pub config: Option<PathBuf>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
pub struct StatusSnapshotReport {
pub context: WorktreeSnapshot,
pub init_script: InitScriptStatus,
pub config: Option<PathBuf>,
}
impl From<&StatusReport> for StatusSnapshotReport {
fn from(report: &StatusReport) -> Self {
Self {
context: WorktreeSnapshot::from(&report.context),
init_script: report.init_script.clone(),
config: report.config.clone(),
}
}
}
pub fn inspect_status(options: StatusOptions) -> Result<StatusReport> {
let context = context::resolve(&WorktreeOptions {
cwd: options.cwd,
root: options.root,
environment: options.environment,
})?;
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,
})
}
pub fn inspect_status_snapshot(options: StatusOptions) -> Result<StatusSnapshotReport> {
inspect_status(options).map(|report| StatusSnapshotReport::from(&report))
}
fn inspect_init_script(context: &Worktree) -> InitScriptStatus {
let scripts = InitScriptDiscovery::discover(context);
if let Some(path) = scripts.executable {
InitScriptStatus::Found { path }
} else {
InitScriptStatus::NotFound {
ignored: scripts.ignored,
}
}
}