use clap::{Parser, Subcommand};
#[derive(Parser, Debug)]
#[command(
name = "gitswitch",
about = "Switch between GitHub accounts (identity + gh auth) on the fly",
version
)]
pub struct Cli {
#[command(subcommand)]
pub command: Command,
}
#[derive(Subcommand, Debug)]
pub enum Command {
Add { alias: String },
List,
Current,
Remove { alias: String },
#[command(external_subcommand)]
Switch(Vec<String>),
}
pub fn resolve_switch_alias(args: &[String]) -> Result<&str, String> {
match args {
[alias] => Ok(alias.as_str()),
[] => Err("expected an account alias to switch to".to_string()),
_ => Err(format!(
"unexpected extra arguments after '{}'; usage: gitswitch <alias>",
args[0]
)),
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn single_token_resolves_to_alias() {
let args = vec!["work".to_string()];
assert_eq!(resolve_switch_alias(&args), Ok("work"));
}
#[test]
fn empty_is_error() {
assert!(resolve_switch_alias(&[]).is_err());
}
#[test]
fn extra_args_are_error() {
let args = vec!["work".to_string(), "extra".to_string()];
assert!(resolve_switch_alias(&args).is_err());
}
}