use crate::{message::Message, reflect::from_reflect_with_fallback, world::World};
use bevy_reflect::{FromReflect, FromType, PartialReflect, Reflect, TypePath, TypeRegistry};
#[derive(Clone)]
pub struct ReflectMessage(ReflectMessageFns);
#[derive(Clone)]
pub struct ReflectMessageFns {
pub write_message: fn(&mut World, &dyn PartialReflect, &TypeRegistry),
}
impl ReflectMessageFns {
pub fn new<M: Message + FromReflect + TypePath>() -> Self {
<ReflectMessage as FromType<M>>::from_type().0
}
}
impl ReflectMessage {
pub fn write_message(
&self,
world: &mut World,
message: &dyn PartialReflect,
registry: &TypeRegistry,
) {
(self.0.write_message)(world, message, registry);
}
pub fn new(fns: ReflectMessageFns) -> Self {
ReflectMessage(fns)
}
pub fn fn_pointers(&self) -> &ReflectMessageFns {
&self.0
}
}
impl<M: Message + Reflect + TypePath> FromType<M> for ReflectMessage {
fn from_type() -> Self {
ReflectMessage(ReflectMessageFns {
write_message: |world, reflected_message, registry| {
let message = from_reflect_with_fallback::<M>(reflected_message, world, registry);
world.write_message(message);
},
})
}
}