use core::ops::{Deref, DerefMut};
use bevy_ecs::bundle::Bundle;
use bevy_ecs::resource::Resource;
#[cfg(feature = "egui")]
pub mod egui;
#[cfg(feature = "egui")]
pub use egui::Egui;
#[cfg(feature = "serde")]
pub mod serde;
#[cfg(feature = "serde")]
pub use serde::Serde;
pub trait Manager: Sized + Send + Sync + 'static {
fn new_entity<T>(&mut self) -> impl Bundle
where
Self: Supports<T>,
{
self.new_entity_for_type()
}
}
pub trait Supports<T>: Manager {
fn new_entity_for_type(&mut self) -> impl Bundle;
}
#[derive(Resource)]
pub struct Instance<M: Manager> {
pub instance: M,
}
impl<M: Manager> Deref for Instance<M> {
type Target = M;
fn deref(&self) -> &M { &self.instance }
}
impl<M: Manager> DerefMut for Instance<M> {
fn deref_mut(&mut self) -> &mut M { &mut self.instance }
}
macro_rules! impl_manager {
($(($n:tt, $M:ident)),*) => {
impl<$($M),*> Manager for ($($M,)*)
where
$($M: Manager),*
{}
impl<T, $($M: Send + Sync + 'static),*> Supports<T> for ($($M,)*)
where
$($M: Supports<T>),*
{
fn new_entity_for_type(&mut self) -> impl Bundle {
#[allow(clippy::unused_unit)]
(
$(
self.$n.new_entity_for_type(),
)*
)
}
}
};
}
variadics_please::all_tuples_enumerated!(impl_manager, 0, 8, T);