use std::{ffi::CStr, os::raw::c_char};
use zsh_sys as zsys;
pub struct Opts {
raw: zsys::Options,
}
impl Opts {
pub(crate) unsafe fn from_raw(raw: zsys::Options) -> Self {
Self { raw }
}
pub fn is_minus(&self, c: c_char) -> bool {
let expr = unsafe { (*self.raw).ind[c as usize] & 1 };
expr != 0
}
pub fn is_plus(&self, c: c_char) -> bool {
let expr = unsafe { (*self.raw).ind[c as usize] & 2 };
expr != 0
}
pub fn is_set(&self, c: c_char) -> bool {
unsafe { (*self.raw).ind[c as usize] != 0 }
}
pub fn get_arg(&self, c: c_char) -> Option<&str> {
unsafe {
let args =
std::ptr::slice_from_raw_parts((*self.raw).args, (*self.raw).argscount as usize);
let opt = (*self.raw).ind[c as usize];
if opt > 3 {
CStr::from_ptr((*args)[(opt >> 2) as usize - 1])
.to_str()
.ok()
} else {
None
}
}
}
}