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());
if err.kind() == DisplayHelp {
writeln!(stdout(), "{}", str)?;
Err(Error::ExitCode(0))
} else {
error(str);
Err(Error::Usage)
}
},
};
args.finished()?;
return out;
}