build.rs
Ref: Size: 1.2 KiB
use std::env;
use std::fs;
use std::path::PathBuf;
include!("src/cli.rs");
fn main() {
let out = PathBuf::from(
env::var("MAN_OUT_DIR").unwrap_or_else(|_| {
env::var("OUT_DIR").expect("OUT_DIR not set")
}),
);
let cmd = <Cli as clap::CommandFactory>::command();
generate_manpages(&cmd, &out);
}
fn generate_manpages(cmd: &clap::Command, out: &PathBuf) {
let man = clap_mangen::Man::new(cmd.clone());
let name = cmd.get_name().to_string();
let mut buf = Vec::new();
man.render(&mut buf).expect("failed to render man page");
fs::create_dir_all(out).expect("failed to create man output dir");
fs::write(out.join(format!("{name}.1")), buf)
.expect("failed to write man page");
for sub in cmd.get_subcommands() {
if sub.is_hide_set() {
continue;
}
let sub_name = format!("{}-{}", cmd.get_name(), sub.get_name());
// Leak is fine: build scripts are short-lived processes. clap requires 'static str for name().
let sub_name: &'static str = Box::leak(sub_name.into_boxed_str());
let sub_cmd = sub.clone().name(sub_name);
generate_manpages(&sub_cmd, out);
}
}