rs4j/
macros.rs

1//! Macros for rs4j
2
3/// If a value is equal to another, throw an error.
4#[macro_export]
5macro_rules! equals_throw {
6    ($self: ident.$var: ident, $val: expr, $err: expr) => {
7        if $self.$var == $val {
8            return Err($crate::anyhow::anyhow!($err));
9        }
10    };
11}
12
13/// Basically a ternary
14#[macro_export]
15macro_rules! if_else {
16    ($($cond: expr)+, $($v1: expr)+, $($v2: expr)+) => {
17        if $($cond)+ {
18            $($v1)+
19        } else {
20            $($v2)+
21        }
22    }
23}
24
25/// Make a getter
26#[macro_export]
27macro_rules! getter {
28    ($m: ident = $s: ident.$f: ident as $t: ident) => {
29        #[no_mangle]
30        #[allow(
31            unused_mut,
32            unused_variables,
33            unused_unsafe,
34            non_snake_case,
35            improper_ctypes_definitions,
36            no_mangle_generic_items,
37            deprecated,
38            missing_docs
39        )]
40        pub unsafe extern "system" fn $m<'local>(
41            mut env: JNIEnv<'local>,
42            class: JClass<'local>,
43            ptr: jlong,
44        ) -> $t {
45            let it: &$s = jlong_to_pointer::<$s>(ptr).as_mut().unwrap();
46            it.$f as $t
47        }
48    };
49}
50
51/// Make a setter
52#[macro_export]
53macro_rules! setter {
54    ($m: ident = $ty: ty = $s: ident.$f: ident as $t: ident) => {
55        #[no_mangle]
56        #[allow(
57            unused_mut,
58            unused_variables,
59            unused_unsafe,
60            non_snake_case,
61            improper_ctypes_definitions,
62            no_mangle_generic_items,
63            deprecated,
64            missing_docs
65        )]
66        pub unsafe extern "system" fn $m<'local>(
67            mut env: JNIEnv<'local>,
68            class: JClass<'local>,
69            ptr: jlong,
70            val: $ty,
71        ) -> jlong {
72            let it: &mut $s = jlong_to_pointer::<$s>(ptr).as_mut().unwrap();
73
74            it.$f = val;
75
76            Box::into_raw(Box::new(it)) as jlong
77        }
78    };
79}