reserve 0.2.0

Check domain name availability across grouped extensions, straight from the registry
#![allow(
    clippy::print_stdout,
    reason = "cargo directives are written to stdout"
)]

use std::env;
use std::fs;
use std::io;
use std::path::{Path, PathBuf};

use clap::CommandFactory;

#[path = "src/cli.rs"]
mod cli;

fn main() -> io::Result<()> {
    println!("cargo::rerun-if-changed=src/cli.rs");
    println!("cargo::rerun-if-changed=build.rs");
    println!("cargo::rerun-if-env-changed=SOURCE_DATE_EPOCH");

    let Some(out_dir) = env::var_os("OUT_DIR").map(PathBuf::from) else {
        return Ok(());
    };

    let manuals = out_dir.join("artifacts").join("man");
    fs::create_dir_all(&manuals)?;

    let mut command = cli::Cli::command();
    command.build();

    write_manuals(&command, &manuals)?;
    Ok(())
}

fn write_manuals(command: &clap::Command, target: &Path) -> io::Result<()> {
    let root = clap_mangen::Man::new(command.clone());
    let mut buffer = Vec::new();
    root.render(&mut buffer)?;
    fs::write(target.join("reserve.1"), &buffer)?;

    for sub in command.get_subcommands() {
        let name = format!("reserve-{}", sub.get_name());
        let file = format!("{name}.1");
        let leaked: &'static str = Box::leak(name.into_boxed_str());
        let page = clap_mangen::Man::new(sub.clone().name(leaked));
        let mut buffer = Vec::new();
        page.render(&mut buffer)?;
        fs::write(target.join(file), &buffer)?;
    }

    Ok(())
}