use anyhow::Result;
use clap::Subcommand;
use dialoguer::Password;
use crate::config;
#[derive(Subcommand)]
pub enum WorkspaceCommands {
Add {
name: String,
#[arg(short, long)]
key: Option<String>,
},
#[command(alias = "ls")]
List,
Switch {
name: String,
},
Current,
#[command(alias = "rm")]
Remove {
name: String,
},
}
pub async fn handle(cmd: WorkspaceCommands) -> Result<()> {
match cmd {
WorkspaceCommands::Add { name, key } => add_workspace(&name, key).await,
WorkspaceCommands::List => list_workspaces(),
WorkspaceCommands::Switch { name } => switch_workspace(&name),
WorkspaceCommands::Current => current_workspace(),
WorkspaceCommands::Remove { name } => remove_workspace(&name),
}
}
async fn add_workspace(name: &str, key: Option<String>) -> Result<()> {
let api_key = match key {
Some(k) => k,
None => {
Password::new()
.with_prompt(format!("Enter API key for workspace '{}'", name))
.interact()?
}
};
if api_key.is_empty() {
anyhow::bail!("API key cannot be empty");
}
config::workspace_add(name, &api_key)
}
fn list_workspaces() -> Result<()> {
config::workspace_list()
}
fn switch_workspace(name: &str) -> Result<()> {
config::workspace_switch(name)
}
fn current_workspace() -> Result<()> {
config::workspace_current()
}
fn remove_workspace(name: &str) -> Result<()> {
config::workspace_remove(name)
}