Skip to main content

innate_core/daemon/
command.rs

1#[derive(Subcommand)]
2pub enum DaemonCommands {
3    /// Start the background log-watcher daemon
4    Start {
5        #[arg(long = "watch", value_name = "LOG_DIR")]
6        watch: Vec<std::path::PathBuf>,
7        #[arg(long, value_name = "PATH")]
8        pid_file: Option<std::path::PathBuf>,
9        #[arg(long, value_name = "PATH")]
10        state_db: Option<std::path::PathBuf>,
11        #[arg(long, value_name = "PATH")]
12        log_file: Option<std::path::PathBuf>,
13    },
14    /// Stop a running daemon
15    Stop {
16        #[arg(long, value_name = "PATH")]
17        pid_file: Option<std::path::PathBuf>,
18    },
19    /// Show daemon status
20    Status {
21        #[arg(long, value_name = "PATH")]
22        state_db: Option<std::path::PathBuf>,
23        #[arg(long, value_name = "PATH")]
24        pid_file: Option<std::path::PathBuf>,
25    },
26}
27fn default_pid_file() -> std::path::PathBuf {
28    crate::paths::daemon_pid_path()
29}
30
31fn default_state_db() -> std::path::PathBuf {
32    crate::paths::daemon_state_path()
33}
34
35fn default_log_file() -> std::path::PathBuf {
36    crate::paths::daemon_log_path()
37}
38
39pub(crate) fn run_command(action: &DaemonCommands, db_path: &Path) -> anyhow::Result<()> {
40    match action {
41        DaemonCommands::Start {
42            watch,
43            pid_file,
44            state_db,
45            log_file,
46        } => {
47            // Merge CLI --watch dirs with settings watch_dirs when CLI provides none.
48            let effective_watch: Vec<std::path::PathBuf> = if !watch.is_empty() {
49                watch.clone()
50            } else {
51                let s = crate::settings::load();
52                crate::settings::resolved_watch_dirs(&s)
53                    .into_iter()
54                    .map(std::path::PathBuf::from)
55                    .collect()
56            };
57            super::start(
58                &effective_watch,
59                db_path,
60                pid_file.as_deref().unwrap_or(&default_pid_file()),
61                state_db.as_deref().unwrap_or(&default_state_db()),
62                log_file.as_deref().unwrap_or(&default_log_file()),
63            )
64        }
65        DaemonCommands::Stop { pid_file } => {
66            super::stop(pid_file.as_deref().unwrap_or(&default_pid_file()))
67        }
68        DaemonCommands::Status { state_db, pid_file } => super::status(
69            state_db.as_deref().unwrap_or(&default_state_db()),
70            pid_file.as_deref().unwrap_or(&default_pid_file()),
71        ),
72    }
73}
74use std::path::Path;
75
76use clap::Subcommand;