use std::{ffi::CString, ptr};
use crate::{
consts::{BlkidProbreqFlags, BlkidUsageFlags},
err::BlkidErr,
probe::BlkidProbe,
Result,
};
impl BlkidProbe {
pub fn filter_usage(&mut self, flags: BlkidProbreqFlags, usage: BlkidUsageFlags) -> Result<()> {
errno!(unsafe {
libblkid_rs_sys::blkid_probe_filter_usage(self.0, flags.into(), usage.into())
})
}
pub fn filter_types(&mut self, flags: BlkidProbreqFlags, names: &[&str]) -> Result<()> {
let cstring_vec: Vec<_> = names.iter().map(|name| CString::new(*name)).collect();
if cstring_vec
.iter()
.any(|cstring_result| cstring_result.is_err())
{
return Err(BlkidErr::InvalidConv);
}
let checked_cstring_vec: Vec<_> =
cstring_vec.into_iter().filter_map(|cs| cs.ok()).collect();
let mut ptr_vec: Vec<_> = checked_cstring_vec
.iter()
.map(|cstring| cstring.as_ptr() as *mut _)
.collect();
ptr_vec.push(ptr::null_mut());
errno!(unsafe {
libblkid_rs_sys::blkid_probe_filter_types(self.0, flags.into(), ptr_vec.as_mut_ptr())
})
}
pub fn invert_filter(&mut self) -> Result<()> {
errno!(unsafe { libblkid_rs_sys::blkid_probe_invert_filter(self.0) })
}
pub fn reset_filter(&mut self) -> Result<()> {
errno!(unsafe { libblkid_rs_sys::blkid_probe_reset_filter(self.0) })
}
}