maa-framework 0.5.0

Rust bindings for MaaFramework
Documentation
#![allow(dead_code)]
#![allow(non_upper_case_globals)]
#![allow(non_camel_case_types)]
#![allow(non_snake_case)]

use crate::{msg::MaaMsg, CallbackHandler};

#[cfg(not(docsrs))]
include!(concat!(env!("OUT_DIR"), "/bindings.rs"));

#[cfg(docsrs)]
include!("../build/pregenerated_bindings.rs");

#[macro_export]
macro_rules! maa_bool {
    ($v:expr) => {
        $v != 0
    };

    ($v:expr, $e:ident) => {
        if $v != 0 {
            Ok(())
        } else {
            Err(Error::$e)
        }
    };

    ($v:expr, $e:ident, $c:expr) => {
        if $v != 0 {
            Ok(())
        } else {
            Err(Error::$e($c))
        }
    };
}

#[macro_export]
macro_rules! string {
    ($string_view:expr) => {
        unsafe {
            std::ffi::CStr::from_ptr($string_view)
                .to_str()
                .unwrap()
                .to_string()
        }
    };
}

#[allow(clippy::unwrap_used)]
#[inline]
pub(crate) fn to_cstring(s: &str) -> *const i8 {
    std::ffi::CString::new(s).unwrap().into_raw()
}

pub(crate) unsafe extern "C" fn callback_handler<T: CallbackHandler>(
    msg: *const std::os::raw::c_char,
    details_json: *const std::os::raw::c_char,
    user_data: *mut std::os::raw::c_void,
) {
    let msg = string!(msg);
    let details_json = string!(details_json);
    let maa_msg = MaaMsg::from(&msg, &details_json).unwrap();
    let callback_handler = &mut *(user_data as *mut T);
    callback_handler.handle(maa_msg);
}