From rust-cli-developer
Provides common Clap patterns and idioms for argument parsing, validation, and CLI design in Rust. Useful when implementing CLI arguments with Clap v4+.
How this skill is triggered — by the user, by Claude, or both
Slash command
/rust-cli-developer:clap-patternsThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Common patterns and idioms for using Clap v4+ effectively in Rust CLI applications.
Common patterns and idioms for using Clap v4+ effectively in Rust CLI applications.
#[derive(Parser)]
#[command(version, about)]
struct Cli {
#[arg(short, long)]
input: PathBuf,
}
fn build_cli() -> Command {
Command::new("app")
.arg(Arg::new("input").short('i'))
}
#[derive(Parser)]
struct Cli {
#[arg(short, long, global = true, action = ArgAction::Count)]
verbose: u8,
#[command(subcommand)]
command: Commands,
}
#[derive(Parser)]
#[command(group(
ArgGroup::new("format")
.required(true)
.args(&["json", "yaml", "toml"])
))]
struct Cli {
#[arg(long)]
json: bool,
#[arg(long)]
yaml: bool,
#[arg(long)]
toml: bool,
}
fn parse_port(s: &str) -> Result<u16, String> {
let port: u16 = s.parse()
.map_err(|_| format!("`{s}` isn't a valid port"))?;
if (1024..=65535).contains(&port) {
Ok(port)
} else {
Err(format!("port not in range 1024-65535"))
}
}
#[derive(Parser)]
struct Cli {
#[arg(long, value_parser = parse_port)]
port: u16,
}
#[derive(Parser)]
struct Cli {
#[arg(long, env = "API_TOKEN")]
token: String,
#[arg(long, env = "API_ENDPOINT", default_value = "https://api.example.com")]
endpoint: String,
}
#[derive(Args)]
struct CommonOpts {
#[arg(short, long)]
verbose: bool,
#[arg(short, long)]
config: Option<PathBuf>,
}
#[derive(Parser)]
struct Cli {
#[command(flatten)]
common: CommonOpts,
#[command(subcommand)]
command: Commands,
}
#[derive(Parser)]
struct Cli {
/// Tags (can be specified multiple times)
#[arg(short, long)]
tag: Vec<String>,
/// Files to process
files: Vec<PathBuf>,
}
// Usage: myapp --tag rust --tag cli file1.txt file2.txt
#[derive(Parser)]
struct Cli {
#[command(subcommand)]
command: Commands,
}
#[derive(Subcommand)]
enum Commands {
Build(BuildArgs),
Test(TestArgs),
}
#[derive(Args)]
struct BuildArgs {
#[command(flatten)]
common: CommonOpts,
#[arg(short, long)]
release: bool,
}
#[derive(Parser)]
struct Cli {
/// Verbosity (-v, -vv, -vvv)
#[arg(short, long, action = ArgAction::Count)]
verbose: u8,
}
// Usage: -v (1), -vv (2), -vvv (3)
#[derive(Parser)]
#[command(
after_help = "EXAMPLES:\n \
myapp --input file.txt\n \
myapp -i file.txt -vv\n\n\
For more info: https://example.com"
)]
struct Cli {
// ...
}
#[derive(Parser)]
struct Cli {
#[arg(short, long, value_name = "FILE", value_hint = ValueHint::FilePath)]
input: PathBuf,
#[arg(short, long, value_name = "DIR", value_hint = ValueHint::DirPath)]
output: PathBuf,
#[arg(short, long, value_name = "URL", value_hint = ValueHint::Url)]
endpoint: String,
}
fn default_config_path() -> PathBuf {
dirs::config_dir()
.unwrap()
.join("myapp")
.join("config.toml")
}
#[derive(Parser)]
struct Cli {
#[arg(long, default_value_os_t = default_config_path())]
config: PathBuf,
}
value_name for clearer help textValueEnum for fixed set of choicesafter_helpnpx claudepluginhub p/geoffjay-rust-cli-developer-plugins-rust-cli-developerGuides completion of development work by verifying tests, detecting environment, and presenting structured options for merge, PR, or cleanup.
Enforces test-driven development: write failing test first, then minimal code to pass. Use when implementing features or bugfixes.
Guides creation and editing of skills using test-driven development with pressure scenarios and subagents to verify agent compliance.