1use 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}