use std::ffi::OsString;
use std::path::PathBuf;
use clap::{Parser, Subcommand, ValueEnum};
#[derive(Debug, Parser)]
#[command(
name = "pmpx",
version,
about = "一个命令面,识别项目类型,转发给真正的工具",
long_about = None,
// 子命令名与别名都要能被 `visible_aliases` 显示出来,方便 `--help` 自查。
arg_required_else_help = false,
)]
pub struct Cli {
#[arg(short = 'p', long = "plugin", global = true, value_name = "NAME")]
pub plugin: Option<String>,
#[arg(short = 'C', long = "dir", global = true, value_name = "PATH")]
pub dir: Option<PathBuf>,
#[arg(long = "no-walk-up", global = true)]
pub no_walk_up: bool,
#[arg(short = 'q', long = "quiet", global = true)]
pub quiet: bool,
#[command(subcommand)]
pub command: Option<Command>,
}
#[derive(Debug, Subcommand)]
pub enum Command {
#[command(visible_aliases = ["i", "add"])]
Install {
#[arg(value_name = "PKG")]
packages: Vec<OsString>,
},
#[command(visible_aliases = ["rm", "uninstall"])]
Remove {
#[arg(value_name = "PKG", required = true)]
packages: Vec<OsString>,
},
#[command(visible_alias = "r")]
Run {
#[arg(value_name = "TARGET")]
target: Option<OsString>,
#[arg(last = true, value_name = "ARG")]
args: Vec<OsString>,
},
#[command(visible_alias = "b")]
Build {
#[arg(last = true, value_name = "ARG")]
args: Vec<OsString>,
},
#[command(visible_alias = "t")]
Test {
#[arg(last = true, value_name = "ARG")]
args: Vec<OsString>,
},
#[command(visible_alias = "up")]
Update {
#[arg(value_name = "PKG")]
packages: Vec<OsString>,
},
#[command(visible_alias = "x")]
Exec {
#[arg(
value_name = "CMD",
required = true,
trailing_var_arg = true,
allow_hyphen_values = true
)]
command: Vec<OsString>,
},
Info,
#[command(subcommand)]
Plugin(PluginCommand),
#[command(subcommand)]
Config(ConfigCommand),
Completion {
#[arg(value_name = "SHELL")]
shell: clap_complete::Shell,
},
}
#[derive(Debug, Subcommand)]
pub enum PluginCommand {
#[command(visible_alias = "list")]
Ls {
#[arg(long)]
flat: bool,
},
Current,
Set {
#[arg(value_name = "NAME")]
name: String,
},
Unset {
#[arg(value_name = "FAMILY")]
family: Option<String>,
#[arg(long)]
yes: bool,
},
Add {
#[arg(value_name = "NAME", required = true)]
names: Vec<String>,
#[arg(long, value_name = "VERSION")]
version: Option<String>,
},
Rm {
#[arg(value_name = "NAME", required = true)]
names: Vec<String>,
},
Update {
#[arg(value_name = "NAME")]
names: Vec<String>,
#[arg(long, value_name = "VERSION")]
version: Option<String>,
},
Search {
#[arg(value_name = "KEYWORD", required = true)]
keyword: String,
#[arg(long, default_value_t = 20, value_name = "N")]
limit: usize,
},
Info {
#[arg(value_name = "NAME")]
name: String,
},
}
#[derive(Debug, Subcommand)]
pub enum ConfigCommand {
Get {
#[arg(value_name = "KEY")]
key: String,
},
Set {
#[arg(value_name = "KEY")]
key: String,
#[arg(value_name = "VALUE")]
value: String,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, ValueEnum)]
pub enum OutputFormat {
Text,
Json,
}