use std::marker::PhantomData;
pub use bevy_app::App;
use bevy_app::Plugin;
use bevy_ecs::component::Component;
use bevy_ecs::reflect::{AppFunctionRegistry, AppTypeRegistry};
use bevy_reflect::{FromType, GetTypeRegistration, Reflect, TypePath};
#[derive(Clone, Copy)]
pub struct WasvyComponentRegistration {
pub register: fn(&mut App),
}
#[derive(Clone, Copy)]
pub struct WasvyMethodMetadata {
pub type_path: &'static str,
pub method: &'static str,
pub arg_names: &'static [&'static str],
}
#[derive(Clone, Copy)]
pub struct WasvyMethodsRegistration {
pub register: fn(&mut App),
}
inventory::collect!(WasvyComponentRegistration);
inventory::collect!(WasvyMethodMetadata);
inventory::collect!(WasvyMethodsRegistration);
#[doc(hidden)]
#[macro_export]
macro_rules! __wasvy_submit_component_registration {
($info:expr) => {
$crate::authoring::inventory::submit! { $info }
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __wasvy_submit_methods_registration {
($info:expr) => {
$crate::authoring::inventory::submit! { $info }
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __wasvy_submit_method_metadata {
($info:expr) => {
$crate::authoring::inventory::submit! { $info }
};
}
pub use inventory;
#[derive(Clone)]
pub struct WasvyExport;
impl<T> FromType<T> for WasvyExport {
fn from_type() -> Self {
WasvyExport
}
}
pub trait WasvyComponent: Component + Reflect + TypePath + GetTypeRegistration {
fn register(app: &mut App)
where
Self: Sized,
{
app.register_type::<Self>();
app.register_type_data::<Self, WasvyExport>();
}
}
pub trait WasvyMethods: Reflect + TypePath {
fn register_methods(app: &mut App);
}
pub struct WasvyComponentPlugin<T>(PhantomData<T>);
impl<T> Default for WasvyComponentPlugin<T> {
fn default() -> Self {
Self(PhantomData)
}
}
impl<T: WasvyComponent> Plugin for WasvyComponentPlugin<T> {
fn build(&self, app: &mut App) {
T::register(app);
}
}
pub struct WasvyMethodsPlugin<T>(PhantomData<T>);
impl<T> Default for WasvyMethodsPlugin<T> {
fn default() -> Self {
Self(PhantomData)
}
}
impl<T: WasvyMethods> Plugin for WasvyMethodsPlugin<T> {
fn build(&self, app: &mut App) {
app.init_resource::<AppFunctionRegistry>();
T::register_methods(app);
}
}
pub struct WasvyAutoRegistrationPlugin;
impl Plugin for WasvyAutoRegistrationPlugin {
fn build(&self, app: &mut App) {
app.init_resource::<AppTypeRegistry>();
app.init_resource::<AppFunctionRegistry>();
for registration in inventory::iter::<WasvyComponentRegistration> {
(registration.register)(app);
}
for registration in inventory::iter::<WasvyMethodsRegistration> {
(registration.register)(app);
}
}
}