1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
use std::{
env,
fs::{self, File},
io,
path::{Path, PathBuf},
};
use clap::{CommandFactory, ValueEnum};
use clap_complete::Shell;
use clap_mangen::Man;
#[path = "src/config.rs"]
mod config;
fn main() {
let Some(out_dir): Option<PathBuf> = env::var_os("OUT_DIR").map(Into::into) else {
eprintln!("OUT_DIR environment variable not defined.");
std::process::exit(1);
};
fs::create_dir_all(&out_dir).unwrap();
let cmd = config::Config::command();
let bin_name = cmd.get_bin_name().unwrap_or_else(|| cmd.get_name());
if let Err(err) = mangen(bin_name, &out_dir) {
eprintln!("Failed to generate man page: {}", err);
}
if let Err(err) = complete(bin_name, &out_dir) {
eprintln!("Failed to generate shell completion: {}", err);
}
println!("cargo:rerun-if-changed=src/config.rs");
println!("cargo:rerun-if-changed=build.rs");
}
fn mangen(bin_name: &str, out_dir: &Path) -> io::Result<()> {
let cmd = config::Config::command();
let mut file = File::create(out_dir.join(format!("{bin_name}.1")))?;
Man::new(cmd).render(&mut file)
}
fn complete(bin_name: &str, out_dir: &Path) -> io::Result<()> {
let mut cmd = config::Config::command();
Shell::value_variants().iter().try_for_each(|&shell| {
clap_complete::generate_to(shell, &mut cmd, bin_name, out_dir).map(|_| ())
})
}
|