use crate::InferenceError;
pub(crate) type Result<T> = std::result::Result<T, InferenceError>;
#[doc(hidden)]
#[macro_export]
macro_rules! cstr {
($str: expr) => {
std::ffi::CString::new($str).expect("a valid C string")
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! try_unsafe {
($e: expr) => {
$crate::InferenceError::convert(unsafe { $e })
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! drop_using_function {
($ty: ty, $free_fn: expr) => {
impl Drop for $ty {
fn drop(&mut self) {
let free = $free_fn;
unsafe { free(self.ptr.cast()) }
}
}
};
}
pub(crate) unsafe fn get_c_string_two_call<F>(get_fn: F) -> Result<String>
where
F: Fn(*mut ::std::os::raw::c_char, *mut usize) -> openvino_genai_sys::ov_status_e,
{
let mut size: usize = 0;
InferenceError::convert(get_fn(std::ptr::null_mut(), &mut size))?;
if size == 0 {
return Ok(String::new());
}
let mut buf = vec![0u8; size];
InferenceError::convert(get_fn(buf.as_mut_ptr().cast(), &mut size))?;
if buf.last() == Some(&0) {
buf.pop();
}
Ok(String::from_utf8_lossy(&buf).into_owned())
}