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 = 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(|_| ()) }) }