use libc::c_char;
use libc::c_int;
use std::ffi::CString;
use std::path::Path;
pub struct CArgs {
argv: Vec<CString>,
argv_ptr: Vec<*const libc::c_char>,
}
impl CArgs {
pub fn new(args: impl IntoIterator<Item = String>) -> Self {
let argv: Vec<_> = args
.into_iter()
.map(|arg| CString::new(arg.as_str()).unwrap())
.collect();
let argv_ptr: Vec<_> = argv
.iter()
.map(|arg| arg.as_ptr())
.chain(std::iter::once(std::ptr::null()))
.collect();
Self { argv, argv_ptr }
}
pub fn argc(&self) -> c_int {
self.argv.len() as c_int
}
pub fn argv(&self) -> *const *const c_char {
self.argv_ptr.as_ptr()
}
pub fn name(&self) -> &str {
Path::new(self.argv[0].to_str().unwrap())
.file_name()
.unwrap()
.to_str()
.unwrap()
}
}