use std::ffi::CStr;
use std::fmt;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Error {
pub status: u32,
pub message: String,
}
impl Error {
pub unsafe fn from_raw(ptr: *mut orbbec_sys::ob_error) -> Self {
let status = unsafe { orbbec_sys::ob_error_get_status(ptr) };
let message = unsafe {
let c = orbbec_sys::ob_error_get_message(ptr);
if c.is_null() {
String::new()
} else {
CStr::from_ptr(c).to_string_lossy().into_owned()
}
};
unsafe { orbbec_sys::ob_delete_error(ptr) };
Self { status, message }
}
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "Orbbec error {}: {}", self.status, self.message)
}
}
impl std::error::Error for Error {}
pub unsafe fn check_error<T>(
f: impl FnOnce(*mut *mut orbbec_sys::ob_error) -> T,
) -> Result<T, Error> {
let mut err: *mut orbbec_sys::ob_error = std::ptr::null_mut();
let ret = f(&mut err);
if err.is_null() {
Ok(ret)
} else {
Err(unsafe { Error::from_raw(err) })
}
}