mirror of
https://github.com/storytold/photocraft.git
synced 2026-11-02 18:13:39 +00:00
69d277440d
Add the man-and-completions example, which writes photocraft-cli's completions for bash, zsh, fish, elvish and PowerShell (clap_complete) and its man pages (clap_mangen: photocraft-cli.1 and one per subcommand, such as photocraft-cli-convert.1) into a directory: cargo run -p photocraft-cli --example man-and-completions -- <out-dir> clap_complete and clap_mangen are dev-dependencies, so the binary is unchanged. clap_mangen gets its env feature, so the pages name each flag's environment variable as --help does; clap already has env, so Cargo.lock gains no package for it. The library exposes only `command()`, the clap definition; the args module stays private. A test runs Command::debug_assert and checks that every shell's completions and every page generate. Another repeats the example's two generate_to calls and pins the exact file list: the five completion files under the names the packages install, photocraft-cli.1, one page per subcommand, and no pages for the help subcommand. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
42 lines
1.5 KiB
Rust
42 lines
1.5 KiB
Rust
//! Writes photocraft-cli's shell completions ([`clap_complete`]: bash, zsh, fish, elvish,
|
|
//! PowerShell) and man pages ([`clap_mangen`]: `photocraft-cli.1` and one per subcommand, such as
|
|
//! `photocraft-cli-convert.1`) into a directory. The Linux and FreeBSD packages ship them
|
|
//! (`packaging/linux/package.sh`, `packaging/freebsd/package.sh`):
|
|
//!
|
|
//! ```sh
|
|
//! cargo run -p photocraft-cli --example man-and-completions -- <out-dir>
|
|
//! ```
|
|
|
|
use std::path::Path;
|
|
use std::process::ExitCode;
|
|
|
|
use clap::ValueEnum;
|
|
use clap_complete::Shell;
|
|
|
|
fn main() -> ExitCode {
|
|
let mut args = std::env::args_os().skip(1);
|
|
let (Some(dir), None) = (args.next(), args.next()) else {
|
|
eprintln!("usage: man-and-completions <out-dir>");
|
|
return ExitCode::from(2);
|
|
};
|
|
let dir = Path::new(&dir);
|
|
match generate(dir) {
|
|
Ok(()) => ExitCode::SUCCESS,
|
|
Err(e) => {
|
|
eprintln!("error: {}: {e}", dir.display());
|
|
ExitCode::FAILURE
|
|
}
|
|
}
|
|
}
|
|
|
|
fn generate(dir: &Path) -> std::io::Result<()> {
|
|
std::fs::create_dir_all(dir)?;
|
|
let mut cmd = photocraft_cli::command();
|
|
for &shell in Shell::value_variants() {
|
|
clap_complete::generate_to(shell, &mut cmd, "photocraft-cli", dir)?;
|
|
}
|
|
// A fresh command: `clap_complete::generate_to` built `cmd`, adding the `help` subcommand,
|
|
// which `clap_mangen` would otherwise give pages of its own (`photocraft-cli-help-convert.1`).
|
|
clap_mangen::generate_to(photocraft_cli::command(), dir)
|
|
}
|