qrrs 0.1.10

CLI QR code generator and reader
Documentation
include!("src/cli/args.rs");

use clap::{Command, CommandFactory};
use clap_complete::{
    generate_to,
    Shell::{Bash, Fish, PowerShell, Zsh},
};
use clap_mangen::Man;

use roff::{line_break, roman, Roff};

use std::{
    env,
    error::Error,
    path::{Path, PathBuf},
};

type Res = Result<(), Box<dyn Error>>;

fn main() -> Res {
    let mut cli = Arguments::command();

    let profile = env::var("PROFILE")?;
    if let "release" = profile.as_str() {
        let outdir_completions = PathBuf::from("./completions");
        let outdir_manpage = PathBuf::from("./man");

        generate_completions(&mut cli, &outdir_completions)?;
        generate_manpage(cli, &outdir_manpage)?;
    }

    Ok(())
}

fn generate_completions(cli: &mut Command, outdir: &Path) -> Res {
    vec![Bash, Zsh, Fish, PowerShell]
        .into_iter()
        .for_each(|sh| {
            let path = generate_to(sh, cli, "qrrs", outdir);

            println!(
                "cargo:warning=completion file for {:?} is generated: {:?}",
                sh, path
            );
        });

    Ok(())
}

fn generate_manpage(cli: Command, outdir: &Path) -> Res {
    let mut buffer: Vec<u8> = Default::default();

    let man_file = outdir.join("qrrs.1");
    let man = Man::new(cli);
    man.render(&mut buffer)?;
    Roff::new()
        .control("SH", ["EXAMPLES OF USAGE"])
        .text([
            roman("qrrs \"Your input here\""),
            line_break(),
            roman("qrrs \"Something\" /tmp/qr.png "),
            line_break(),
            roman("qrrs -r /tmp/qr.png "),
            line_break(),
        ])
        .to_writer(&mut buffer)?;

    std::fs::write(&man_file, buffer)?;
    println!("cargo:warning=manpage file is generated: {:?}", man_file);

    Ok(())
}