use std::path::PathBuf;
use clap::{Args, Parser, Subcommand};
pub(crate) const DEFAULT_CANISTER: &str = "demo_rpg";
#[derive(Debug, Parser)]
#[command(
name = "icydb",
about = "Developer CLI tools for IcyDB",
long_about = None
)]
pub(crate) struct CliArgs {
#[command(subcommand)]
pub(crate) command: CliCommand,
}
#[derive(Debug, Subcommand)]
pub(crate) enum CliCommand {
Sql(SqlArgs),
#[command(subcommand)]
Canister(CanisterCommand),
#[command(subcommand)]
Demo(DemoCommand),
}
#[derive(Args, Debug)]
#[command(trailing_var_arg = true)]
pub(crate) struct SqlArgs {
#[arg(short, long, env = "SQLQ_CANISTER")]
pub(crate) canister: Option<String>,
#[arg(long, env = "SQLQ_HISTORY_FILE", default_value = ".cache/sql_history")]
pub(crate) history_file: PathBuf,
#[arg(long, conflicts_with = "trailing_sql")]
pub(crate) sql: Option<String>,
#[arg(value_name = "SQL", allow_hyphen_values = true)]
pub(crate) trailing_sql: Vec<String>,
}
#[derive(Args, Clone, Debug)]
pub(crate) struct CanisterTarget {
#[arg(short, long, env = "SQLQ_CANISTER")]
pub(crate) canister: Option<String>,
}
impl CanisterTarget {
pub(crate) fn canister_name(&self) -> &str {
self.canister.as_deref().unwrap_or(DEFAULT_CANISTER)
}
}
#[derive(Debug, Subcommand)]
pub(crate) enum CanisterCommand {
List,
Deploy(CanisterTarget),
Reinstall(CanisterTarget),
Upgrade(UpgradeArgs),
Status(CanisterTarget),
}
#[derive(Args, Debug)]
pub(crate) struct UpgradeArgs {
#[command(flatten)]
pub(crate) target: CanisterTarget,
#[arg(long)]
pub(crate) wasm: Option<PathBuf>,
}
#[derive(Debug, Subcommand)]
pub(crate) enum DemoCommand {
Reset(CanisterTarget),
Seed(CanisterTarget),
Reload(CanisterTarget),
Fresh(CanisterTarget),
}