use bevy_ecs::prelude::Event;
use bevy_hierarchy::DespawnRecursiveExt;
use crate::{
Impulsive, Input, InputBundle, ManageInput, OperationRequest, OperationResult, OperationSetup,
OrBroken,
};
pub(crate) struct SendEvent<T> {
_ignore: std::marker::PhantomData<fn(T)>,
}
impl<T> SendEvent<T> {
pub(crate) fn new() -> Self {
Self {
_ignore: Default::default(),
}
}
}
impl<T: 'static + Send + Sync + Event> Impulsive for SendEvent<T> {
fn setup(self, OperationSetup { source, world }: OperationSetup) -> OperationResult {
world.entity_mut(source).insert(InputBundle::<T>::new());
Ok(())
}
fn execute(OperationRequest { source, world, .. }: OperationRequest) -> OperationResult {
let mut source_mut = world.get_entity_mut(source).or_broken()?;
let Input { data, .. } = source_mut.take_input::<T>()?;
source_mut.despawn_recursive();
world.send_event(data);
Ok(())
}
}