opencv/manual/
sys.rs

1// note to self, you can't use union here to store both result and error code because C++ side doesn't
2// support non-POD types as union fields
3
4use std::ffi::c_void;
5use std::mem::MaybeUninit;
6
7use crate::templ::receive_string;
8use crate::Error;
9
10#[repr(C)]
11pub struct Result<T> {
12	pub error_code: i32,
13	pub error_msg: *mut c_void,
14	pub result: MaybeUninit<T>,
15}
16
17impl<T> Result<T> {
18	#[inline]
19	pub fn into_result(self) -> crate::Result<T> {
20		if self.error_msg.is_null() {
21			Ok(unsafe { self.result.assume_init() })
22		} else {
23			let error_msg = if self.error_msg.is_null() {
24				"Unable to receive error message".to_string()
25			} else {
26				unsafe { receive_string(self.error_msg.cast::<String>()) }
27			};
28			Err(Error::new(self.error_code, error_msg))
29		}
30	}
31}