mod list;
mod login;
mod logout;
use crate::config::AppConfig;
use clap::Subcommand;
use std::path::PathBuf;
#[derive(Subcommand, PartialEq, Debug)]
pub enum AuthCommands {
Login {
#[arg(long, default_value = "stakpak")]
provider: String,
#[arg(long, short)]
profile: Option<String>,
#[arg(long)]
api_key: Option<String>,
#[arg(long)]
endpoint: Option<String>,
#[arg(long)]
region: Option<String>,
#[arg(long)]
profile_name: Option<String>,
},
Logout {
#[arg(long)]
provider: Option<String>,
#[arg(long, short)]
profile: Option<String>,
},
List {
#[arg(long, short)]
profile: Option<String>,
},
}
impl AuthCommands {
pub async fn run(self, config: AppConfig) -> Result<(), String> {
let config_dir = get_config_dir(&config)?;
match self {
AuthCommands::Login {
provider,
profile,
api_key,
endpoint,
region,
profile_name,
} => {
login::handle_login(
&config_dir,
&provider,
profile.as_deref(),
api_key,
endpoint,
region,
profile_name,
)
.await
}
AuthCommands::Logout { provider, profile } => {
logout::handle_logout(&config_dir, provider.as_deref(), profile.as_deref())
}
AuthCommands::List { profile } => list::handle_list(&config_dir, profile.as_deref()),
}
}
}
fn get_config_dir(config: &AppConfig) -> Result<PathBuf, String> {
if !config.config_path.is_empty() {
let path = PathBuf::from(&config.config_path);
if let Some(parent) = path.parent() {
return Ok(parent.to_path_buf());
}
}
dirs::home_dir()
.map(|h| h.join(".stakpak"))
.ok_or_else(|| "Could not determine home directory".to_string())
}