#![macro_use]
#[macro_export]
macro_rules! godot_nativescript_init {
() => {
fn godot_nativescript_init_empty(_init: $crate::init::InitHandle) {}
$crate::godot_nativescript_init!(godot_nativescript_init_empty);
};
($callback:ident) => {
$crate::godot_nativescript_init!($callback as godot_nativescript_init);
};
(_ as $fn_name:ident) => {
fn godot_nativescript_init_empty(_init: $crate::init::InitHandle) {}
$crate::godot_nativescript_init!(godot_nativescript_init_empty as $fn_name);
};
($callback:ident as $fn_name:ident) => {
#[no_mangle]
#[doc(hidden)]
#[allow(unused_unsafe)]
pub unsafe extern "C" fn $fn_name(handle: *mut $crate::libc::c_void) {
if !$crate::private::is_api_bound() {
return;
}
#[cfg(not(feature = "custom-godot"))]
{
use $crate::core_types::Variant;
let engine = gdnative::api::Engine::godot_singleton();
let info = engine.get_version_info();
if info.get("major").expect("major version") != Variant::new(3)
|| info.get("minor").expect("minor version") != Variant::new(5)
|| info.get("patch").expect("patch version") < Variant::new(1) {
let string = info.get("string").expect("version str").to::<String>().expect("version str type");
$crate::log::godot_warn!(
"This godot-rust version is only compatible with Godot >= 3.5.1 and < 3.6; detected version {}.\n\
GDNative mismatches may lead to subtle bugs, undefined behavior or crashes at runtime.\n\
Apply the 'custom-godot' feature if you want to use current godot-rust with another Godot engine version.",
string
);
}
}
$crate::private::report_panics("nativescript_init", || {
$crate::init::auto_register($crate::init::InitHandle::new(handle, $crate::init::InitLevel::AUTO));
$callback($crate::init::InitHandle::new(handle, $crate::init::InitLevel::USER));
$crate::init::diagnostics::missing_suggested_diagnostics();
});
}
};
}
#[macro_export]
macro_rules! godot_gdnative_init {
() => {
fn godot_gdnative_init_empty(_options: &$crate::init::InitializeInfo) {}
$crate::init::godot_gdnative_init!(godot_gdnative_init_empty);
};
(_ as $fn_name:ident) => {
fn godot_gdnative_init_empty(_options: &$crate::init::InitializeInfo) {}
$crate::init::godot_gdnative_init!(godot_gdnative_init_empty as $fn_name);
};
($callback:ident) => {
$crate::init::godot_gdnative_init!($callback as godot_gdnative_init);
};
($callback:ident as $fn_name:ident) => {
#[no_mangle]
#[doc(hidden)]
#[allow(unused_unsafe)]
pub unsafe extern "C" fn $fn_name(options: *mut $crate::sys::godot_gdnative_init_options) {
if !$crate::private::bind_api(options) {
return;
}
$crate::private::report_panics("gdnative_init", || {
let init_info = $crate::init::InitializeInfo::new(options);
$callback(&init_info)
});
}
};
}
#[macro_export]
macro_rules! godot_gdnative_terminate {
() => {
fn godot_gdnative_terminate_empty(_term_info: &$crate::init::TerminateInfo) {}
$crate::init::godot_gdnative_terminate!(godot_gdnative_terminate_empty);
};
($callback:ident) => {
$crate::init::godot_gdnative_terminate!($callback as godot_gdnative_terminate);
};
(_ as $fn_name:ident) => {
fn godot_gdnative_terminate_empty(_term_info: &$crate::init::TerminateInfo) {}
$crate::init::godot_gdnative_terminate!(godot_gdnative_terminate_empty as $fn_name);
};
($callback:ident as $fn_name:ident) => {
#[no_mangle]
#[doc(hidden)]
#[allow(unused_unsafe)]
pub unsafe extern "C" fn $fn_name(
options: *mut $crate::sys::godot_gdnative_terminate_options,
) {
if !$crate::private::is_api_bound() {
return;
}
$crate::private::report_panics("gdnative_terminate", || {
let term_info = $crate::init::TerminateInfo::new(options);
$callback(&term_info)
});
$crate::private::cleanup_internal_state();
}
};
}
#[macro_export]
macro_rules! godot_init {
($callback:ident) => {
$crate::init::godot_gdnative_init!();
$crate::init::godot_nativescript_init!($callback);
$crate::init::godot_gdnative_terminate!();
};
}