clap_bash 0.0.1

Clap argument parsing for bash-builtins.
Documentation
use std::io::{stdout, Write};
use std::ffi::OsStr;
use std::os::unix::ffi::OsStrExt;
use bash_builtins::log::error;
use bash_builtins::{Args, Error, Result};
use clap::Parser;
use clap::error::ErrorKind::DisplayHelp;

pub fn parse_args<P: Parser>(name: &str, args: &mut Args) -> Result<P> {
    let mut cli_args_raw_vec: Vec<&OsStr> = args.raw_arguments()
        .map(|arg| OsStr::from_bytes(arg.to_bytes()))
        .collect();

    let mut cli_args_vec = Vec::with_capacity(cli_args_raw_vec.len() + 1);
    cli_args_vec.push(OsStr::new(name));
    cli_args_vec.append(&mut cli_args_raw_vec);

    let cli_args_opt = P::try_parse_from(cli_args_vec);

    let out = match cli_args_opt {
        Ok(args) => Ok(args),
        Err(err) => {
            //let str = format!("{}", err.render().ansi());
            let str = format!("{}", err.render());

            if err.kind() == DisplayHelp {
                writeln!(stdout(), "{}", str)?;
                Err(Error::ExitCode(0))
            } else {
                error(str);
                Err(Error::Usage)
            }
        },
    };

    args.finished()?;

    return out;
}