use clap::{Args, ValueEnum};
use serde::Serialize;
use crate::commands::Output;
use crate::error::Result;
#[derive(Debug, Clone, Copy, ValueEnum, Default)]
pub enum ShellType {
#[default]
Bash,
Zsh,
Fish,
}
#[derive(Args)]
pub struct AliasesArgs {
#[arg(long, short, value_enum, default_value = "bash")]
pub shell: ShellType,
#[arg(long, short, default_value = "v")]
pub prefix: String,
}
const ALIAS_COMMANDS: &[&str] = &[
"ls", "cat", "write", "mkdir", "rm", "cp", "mv", "tree", "pwd",
"log", "checkout", "revert", "diff",
"search", "grep", "find",
"tag", "untag", "meta",
"import", "export", "exec",
"stats", "prune", "gc", "compact", "maintain",
"quota", "audit", "snapshot", "checkpoint",
"vault", "shell",
#[cfg(feature = "fuse")]
"mount",
#[cfg(feature = "fuse")]
"unmount",
#[cfg(feature = "fuse")]
"proxy",
];
#[derive(Serialize)]
struct AliasesOutput {
shell: String,
prefix: String,
aliases: Vec<AliasEntry>,
}
#[derive(Serialize)]
struct AliasEntry {
name: String,
command: String,
}
pub fn run(args: AliasesArgs, output: &Output) -> Result<()> {
let prefix = &args.prefix;
if output.is_json() {
let aliases: Vec<AliasEntry> = ALIAS_COMMANDS
.iter()
.map(|cmd| AliasEntry {
name: format!("{}{}", prefix, cmd),
command: format!("vfs {}", cmd),
})
.collect();
output.print_json(&AliasesOutput {
shell: format!("{:?}", args.shell).to_lowercase(),
prefix: prefix.clone(),
aliases,
});
} else {
let comment = match args.shell {
ShellType::Bash | ShellType::Zsh => "#",
ShellType::Fish => "#",
};
println!("{} vfs aliases - add to your shell config", comment);
println!("{} Generated with: vfs aliases --shell {:?} --prefix {}",
comment, args.shell, prefix);
println!();
for cmd in ALIAS_COMMANDS {
let alias_name = format!("{}{}", prefix, cmd);
let alias_cmd = format!("vfs {}", cmd);
match args.shell {
ShellType::Bash | ShellType::Zsh => {
println!("alias {}='{}'", alias_name, alias_cmd);
}
ShellType::Fish => {
println!("alias {} '{}'", alias_name, alias_cmd);
}
}
}
println!();
println!("{} Usage: eval \"$(vfs aliases)\"", comment);
}
Ok(())
}