1use std::path::PathBuf;
2
3use crate::context;
4use crate::{Config, InitScriptDiscovery, Result, Worktree, WorktreeOptions};
5
6#[derive(Debug, Clone, Default, PartialEq, Eq)]
8pub struct StatusOptions {
9 pub cwd: Option<PathBuf>,
11 pub root: Option<PathBuf>,
13 pub config: Option<PathBuf>,
15 pub no_init_script: bool,
17}
18
19#[derive(Debug, Clone, PartialEq, Eq)]
21pub enum InitScriptStatus {
22 Skipped,
24 Missing {
26 ignored: Vec<PathBuf>,
28 },
29 Found {
31 path: PathBuf,
33 },
34}
35
36#[derive(Debug, Clone, PartialEq, Eq)]
38pub struct StatusReport {
39 pub context: Worktree,
41 pub init_script: InitScriptStatus,
43 pub config: Option<PathBuf>,
45}
46
47pub fn inspect_status(options: StatusOptions) -> Result<StatusReport> {
57 let context = context::resolve(&WorktreeOptions {
58 cwd: options.cwd,
59 root: options.root,
60 })?;
61 let init_script = if options.no_init_script || options.config.is_some() {
62 InitScriptStatus::Skipped
63 } else {
64 inspect_init_script(&context)
65 };
66 let config = Config::discover_path(&context, options.config.as_deref())?;
67
68 Ok(StatusReport {
69 context,
70 init_script,
71 config,
72 })
73}
74
75fn inspect_init_script(context: &Worktree) -> InitScriptStatus {
76 let scripts = InitScriptDiscovery::discover(context);
77
78 if let Some(path) = scripts.executable {
79 InitScriptStatus::Found { path }
80 } else {
81 InitScriptStatus::Missing {
82 ignored: scripts.ignored,
83 }
84 }
85}