innate_core/daemon/
command.rs1#[derive(Subcommand)]
2pub enum DaemonCommands {
3 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 {
16 #[arg(long, value_name = "PATH")]
17 pid_file: Option<std::path::PathBuf>,
18 },
19 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 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;