use crate::{DaemonControlArgs, InitializeArgs};
#[derive(clap::Subcommand, Debug, Clone, Default)]
pub enum CliSubCommand {
#[default]
Versions,
Start(DaemonControlArgs),
Stop(DaemonControlArgs),
Status(DaemonControlArgs),
Restart(DaemonControlArgs),
#[clap(external_subcommand)]
External(Vec<String>),
#[command(
name = "init",
about = "Initialize `sql-fun` environments",
long_about = r#"Initialize `sql-fun` environments
This command prepares the initial working environment for first-time users.
It creates the sql-fun home directory, downloads or builds the built-in object catalog and extension metadata, and writes configuration files as needed.
Repeated runs are idempotent: existing files are preserved unless you confirm overwrites (or use --yes)."#,
next_line_help = true
)]
Initialize(InitializeArgs),
}
impl CliSubCommand {
fn daemon_binary_name(name: &str) -> String {
format!("sqlfun-{name}-daemon")
}
fn external_binary_name(name: &str) -> String {
format!("sqlfun-{name}")
}
#[must_use]
pub fn binary_names(&self) -> Vec<String> {
let (only_deamon, name) = match self {
CliSubCommand::Start(daemon_control_args)
| CliSubCommand::Stop(daemon_control_args)
| CliSubCommand::Status(daemon_control_args)
| CliSubCommand::Restart(daemon_control_args) => {
(true, daemon_control_args.daemon_name.clone())
}
CliSubCommand::External(args) => {
let Some(name) = args.first() else {
return Vec::new();
};
(false, name.clone())
}
CliSubCommand::Initialize(_) => (false, "init".to_string()),
CliSubCommand::Versions => (false, "versions".to_string()),
};
if only_deamon {
vec![Self::daemon_binary_name(&name)]
} else {
vec![
Self::external_binary_name(&name),
Self::daemon_binary_name(&name),
]
}
}
}