desk-exec 0.1.0

Execute programs defined in XDG desktop entries directly from the command line
Documentation
use std::{
    env, fs,
    io::{ErrorKind, Result},
    path::{Path, PathBuf},
};

use args::Arguments;
use clap::{Command, CommandFactory, ValueEnum};
use clap_complete::Shell;
use clap_complete_nushell::Nushell;
use clap_mangen::Man;

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

fn main() -> Result<()> {
    let out_dir = PathBuf::from(env::var_os("OUT_DIR").ok_or(ErrorKind::NotFound)?);
    let mut cmd = Arguments::command();

    gen_manpage(&cmd, &out_dir)?;
    gen_completions(&mut cmd, &out_dir)?;

    Ok(())
}

fn gen_manpage(cmd: &Command, out_dir: &Path) -> Result<()> {
    let man = Man::new(cmd.clone());

    let mut buffer = Vec::new();
    man.render(&mut buffer)?;

    fs::write(out_dir.join("desk-exec.1"), buffer)?;

    Ok(())
}

fn gen_completions(cmd: &mut Command, out_dir: &Path) -> Result<()> {
    for &shell in Shell::value_variants() {
        clap_complete::generate_to(shell, cmd, "desk-exec", out_dir)?;
    }
    clap_complete::generate_to(Nushell, cmd, "desk-exec", out_dir)?;

    Ok(())
}