Skip to main content

sql_fun_core/args/
cli_sub_command.rs

1use crate::{DaemonControlArgs, InitializeArgs};
2
3/// CLI Subcommand args
4#[derive(clap::Subcommand, Debug, Clone, Default)]
5pub enum CliSubCommand {
6    /// Get versions
7    #[default]
8    Versions,
9
10    /// Start daemon extension
11    Start(DaemonControlArgs),
12    /// Stop daemon extension
13    Stop(DaemonControlArgs),
14    /// Show status of daemon extension
15    Status(DaemonControlArgs),
16    /// Restart daemon extension
17    Restart(DaemonControlArgs),
18
19    /// External subcommand (captured undefined commands)
20    #[clap(external_subcommand)]
21    External(Vec<String>),
22
23    /// Initialize `sql-fun` environments
24    ///
25    #[command(
26        name = "init",
27        about = "Initialize `sql-fun` environments",
28        long_about = r#"Initialize `sql-fun` environments
29
30This command prepares the initial working environment for first-time users.
31It creates the sql-fun home directory, downloads or builds the built-in object catalog and extension metadata, and writes configuration files as needed.
32Repeated runs are idempotent: existing files are preserved unless you confirm overwrites (or use --yes)."#,
33        next_line_help = true
34    )]
35    Initialize(InitializeArgs),
36}
37
38impl CliSubCommand {
39    fn daemon_binary_name(name: &str) -> String {
40        format!("sqlfun-{name}-daemon")
41    }
42
43    fn external_binary_name(name: &str) -> String {
44        format!("sqlfun-{name}")
45    }
46
47    /// binary name expects
48    #[must_use]
49    pub fn binary_names(&self) -> Vec<String> {
50        let (only_deamon, name) = match self {
51            CliSubCommand::Start(daemon_control_args)
52            | CliSubCommand::Stop(daemon_control_args)
53            | CliSubCommand::Status(daemon_control_args)
54            | CliSubCommand::Restart(daemon_control_args) => {
55                (true, daemon_control_args.daemon_name.clone())
56            }
57            CliSubCommand::External(args) => {
58                let Some(name) = args.first() else {
59                    return Vec::new();
60                };
61                (false, name.clone())
62            }
63            CliSubCommand::Initialize(_) => (false, "init".to_string()),
64            CliSubCommand::Versions => (false, "versions".to_string()),
65        };
66        if only_deamon {
67            vec![Self::daemon_binary_name(&name)]
68        } else {
69            vec![
70                Self::external_binary_name(&name),
71                Self::daemon_binary_name(&name),
72            ]
73        }
74    }
75}