a73x

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);
    }
}