#[macro_export]
macro_rules! export_extension {
($extension:ident) => {
const _: () = {
const _: () = {
assert!(
std::mem::size_of::<$extension>() == 0,
"Extension must be a zero-sized type."
);
};
unsafe extern "C" fn __jackdaw_ctor() -> $crate::ffi::JackdawExtensionPtr {
let obj: Box<dyn JackdawExtension> = Box::new($extension);
unsafe {
let raw: *mut dyn JackdawExtension = Box::into_raw(obj);
std::mem::transmute(raw)
}
}
unsafe extern "C" fn __jackdaw_dtor(ptr: $crate::ffi::JackdawExtensionPtr) {
unsafe {
let ptr: *mut dyn JackdawExtension = std::mem::transmute(ptr);
drop(Box::from_raw(ptr));
}
}
#[unsafe(no_mangle)]
pub extern "C" fn jackdaw_extension_entry_v1() -> $crate::ffi::ExtensionEntry {
$crate::ffi::ExtensionEntry {
api_version: $crate::ffi::API_VERSION,
bevy_version: $crate::ffi::BEVY_VERSION.as_ptr(),
profile: $crate::ffi::PROFILE.as_ptr(),
ctor: __jackdaw_ctor,
dtor: __jackdaw_dtor,
}
}
};
$crate::__jackdaw_emit_reflect_register_symbol!();
};
}
#[macro_export]
macro_rules! export_game {
($name:literal, $plugin:expr) => {
const _: () = {
const __JACKDAW_GAME_NAME_STR: &str = $name;
const __JACKDAW_GAME_NAME: &::core::ffi::CStr =
match ::core::ffi::CStr::from_bytes_with_nul(
::core::concat!($name, "\0").as_bytes(),
) {
::core::result::Result::Ok(s) => s,
::core::result::Result::Err(_) => {
::core::panic!("game name contains interior NUL byte")
}
};
unsafe extern "C" fn __jackdaw_game_build(world: *mut ::bevy::ecs::world::World) {
let world: &mut ::bevy::ecs::world::World = unsafe { &mut *world };
let mut ctx = $crate::runtime::GameApp::new(world, __JACKDAW_GAME_NAME_STR);
$crate::runtime::GamePlugin::build(&$plugin, &mut ctx);
}
unsafe extern "C" fn __jackdaw_game_teardown(world: *mut ::bevy::ecs::world::World) {
let world: &mut ::bevy::ecs::world::World = unsafe { &mut *world };
let mut ctx = $crate::runtime::GameApp::new(world, __JACKDAW_GAME_NAME_STR);
$crate::runtime::GamePlugin::teardown(&$plugin, &mut ctx);
}
#[unsafe(no_mangle)]
pub extern "C" fn jackdaw_game_entry_v1() -> $crate::ffi::GameEntry {
$crate::ffi::GameEntry {
api_version: $crate::ffi::API_VERSION,
bevy_version: $crate::ffi::BEVY_VERSION.as_ptr(),
profile: $crate::ffi::PROFILE.as_ptr(),
name: __JACKDAW_GAME_NAME.as_ptr(),
build: __jackdaw_game_build,
teardown: __jackdaw_game_teardown,
}
}
};
$crate::__jackdaw_emit_reflect_register_symbol!();
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __jackdaw_emit_reflect_register_symbol {
() => {
#[expect(non_snake_case, unexpected_cfgs)]
mod __jackdaw_generated_reflect {
#[cfg(jackdaw_build_has_generated_reflect)]
include!(concat!(env!("OUT_DIR"), "/__jackdaw_reflect_types.rs"));
#[cfg(not(jackdaw_build_has_generated_reflect))]
pub(crate) fn __jackdaw_register_reflect_types(
_registry: &mut ::bevy::reflect::TypeRegistry,
) {
}
}
#[unsafe(no_mangle)]
pub unsafe extern "Rust" fn jackdaw_register_reflect_types_v1(
registry: &mut ::bevy::reflect::TypeRegistry,
) {
__jackdaw_generated_reflect::__jackdaw_register_reflect_types(registry);
}
};
}