use std::path::PathBuf;
use clap::{Args, ValueHint};
use super::{DEFAULT_ENVIRONMENT, ICP_ENVIRONMENT_ENV};
const SQL_HISTORY_FILE: &str = ".cache/sql_history";
pub(crate) struct SqlShellFields {
pub(crate) canister: String,
pub(crate) environment: String,
pub(crate) history_file: PathBuf,
pub(crate) sql: Option<String>,
pub(crate) trailing_sql: Vec<String>,
}
#[derive(Args, Debug)]
#[command(
trailing_var_arg = true,
after_help = "Examples:
icydb sql -c demo_rpg
icydb sql -c demo_rpg --sql \"SELECT name FROM character LIMIT 5\"
icydb sql -c demo_rpg --sql \"CREATE INDEX character_renown_idx ON character (renown)\"
icydb sql -c demo_rpg --sql \"DROP INDEX character_renown_idx ON character\""
)]
pub(crate) struct SqlArgs {
#[arg(short, long, value_name = "CANISTER")]
canister: String,
#[arg(
short,
long,
env = ICP_ENVIRONMENT_ENV,
default_value = DEFAULT_ENVIRONMENT,
value_name = "ENV"
)]
environment: String,
#[arg(long, default_value = SQL_HISTORY_FILE, value_hint = ValueHint::FilePath)]
history_file: PathBuf,
#[arg(long, conflicts_with = "trailing_sql", value_name = "SQL")]
sql: Option<String>,
#[arg(value_name = "SQL", allow_hyphen_values = true)]
trailing_sql: Vec<String>,
}
impl SqlArgs {
pub(crate) fn into_shell_fields(self) -> SqlShellFields {
SqlShellFields {
canister: self.canister,
environment: self.environment,
history_file: self.history_file,
sql: self.sql,
trailing_sql: self.trailing_sql,
}
}
}