aboutsummaryrefslogtreecommitdiffstats
path: root/build.rs
blob: 356b6bbb0e2e96ed9070008ccde186c1073cc038 (plain)
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(|_| ())
    })
}