1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#[macro_export]
macro_rules! ffi_error {
($error:expr) => {{
let err_code = ffi_error_code!($error);
let err_desc = format!("{}", $error);
(err_code, unwrap!(::std::ffi::CString::new(err_desc)))
}}
}
#[macro_export]
macro_rules! ffi_result {
($res:expr) => {
match $res {
Ok(_) => (0, ::std::ffi::CString::default()),
Err(error) => ffi_error!(error)
}
}
}
#[macro_export]
macro_rules! ffi_result_code {
($res:expr) => {
match $res {
Ok(_) => 0,
Err(error) => ffi_error_code!(error),
}
}
}
#[macro_export]
macro_rules! ffi_error_code {
($err:expr) => {{
#[cfg_attr(feature = "cargo-clippy", allow(useless_attribute))]
#[allow(unused)]
use $crate::ErrorCode;
let err = &$err;
let err_str = format!("{:?}", err);
let err_code = err.error_code();
debug!("**ERRNO: {}** {}", err_code, err_str);
err_code
}}
}
#[macro_export]
macro_rules! call_result_cb {
($result:expr, $user_data:expr, $cb:expr) => {
#[cfg_attr(feature = "cargo-clippy", allow(useless_attribute))]
#[allow(unused)]
use $crate::callback::{Callback, CallbackArgs};
let (error_code, description) = ffi_result!($result);
let res = FfiResult {
error_code,
description: description.as_ptr()
};
$cb.call($user_data.into(), &res, CallbackArgs::default());
}
}
#[macro_export]
macro_rules! try_cb {
($result:expr, $user_data:expr, $cb:expr) => {
match $result {
Ok(value) => value,
e @ Err(_) => {
call_result_cb!(e, $user_data, $cb);
return None;
}
}
}
}