sql_fun_core/args/
cli_sub_command.rs1use crate::{DaemonControlArgs, InitializeArgs};
2
3#[derive(clap::Subcommand, Debug, Clone, Default)]
5pub enum CliSubCommand {
6 #[default]
8 Versions,
9
10 Start(DaemonControlArgs),
12 Stop(DaemonControlArgs),
14 Status(DaemonControlArgs),
16 Restart(DaemonControlArgs),
18
19 #[clap(external_subcommand)]
21 External(Vec<String>),
22
23 #[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 #[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}