maa_framework/
internal.rs

1#![allow(dead_code)]
2#![allow(non_upper_case_globals)]
3#![allow(non_camel_case_types)]
4#![allow(non_snake_case)]
5
6use crate::{msg::MaaMsg, CallbackHandler};
7
8#[cfg(not(docsrs))]
9include!(concat!(env!("OUT_DIR"), "/bindings.rs"));
10
11#[cfg(docsrs)]
12include!("../build/pregenerated_bindings.rs");
13
14#[macro_export]
15macro_rules! maa_bool {
16    ($v:expr) => {
17        $v != 0
18    };
19
20    ($v:expr, $e:ident) => {
21        if $v != 0 {
22            Ok(())
23        } else {
24            Err(Error::$e)
25        }
26    };
27
28    ($v:expr, $e:ident, $c:expr) => {
29        if $v != 0 {
30            Ok(())
31        } else {
32            Err(Error::$e($c))
33        }
34    };
35}
36
37#[macro_export]
38macro_rules! string {
39    ($string_view:expr) => {
40        unsafe {
41            std::ffi::CStr::from_ptr($string_view)
42                .to_str()
43                .unwrap()
44                .to_string()
45        }
46    };
47}
48
49#[allow(clippy::unwrap_used)]
50#[inline]
51pub(crate) fn to_cstring(s: &str) -> *const i8 {
52    std::ffi::CString::new(s).unwrap().into_raw()
53}
54
55pub(crate) unsafe extern "C" fn callback_handler<T: CallbackHandler>(
56    msg: *const std::os::raw::c_char,
57    details_json: *const std::os::raw::c_char,
58    user_data: *mut std::os::raw::c_void,
59) {
60    let msg = string!(msg);
61    let details_json = string!(details_json);
62    let maa_msg = MaaMsg::from(&msg, &details_json).unwrap();
63    let callback_handler = &mut *(user_data as *mut T);
64    callback_handler.handle(maa_msg);
65}