From 7f3072ed7e016dff359439d7580403e36ad6b325 Mon Sep 17 00:00:00 2001 From: HampusM Date: Wed, 15 Oct 2025 18:40:19 +0200 Subject: feat(ecs): add EventMatch convenience fns for component events --- ecs/src/event/component.rs | 51 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) (limited to 'ecs/src/event') diff --git a/ecs/src/event/component.rs b/ecs/src/event/component.rs index 96761a6..ed6b7cf 100644 --- a/ecs/src/event/component.rs +++ b/ecs/src/event/component.rs @@ -2,6 +2,11 @@ use std::convert::Infallible; +use crate::component::{Handle as ComponentHandle, HandleMut as ComponentHandleMut}; +use crate::entity::Handle as EntityHandle; +use crate::pair::Pair; +use crate::system::observer::EventMatch; +use crate::util::impl_multiple; use crate::Component; /// Pair relation for events emitted when: @@ -18,3 +23,49 @@ pub struct Removed(Infallible); #[derive(Debug, Component)] pub struct Changed(Infallible); + +impl_multiple!( + EventMatch, + ( + impl _<'_>> (removed), + impl _<'_>> (added), + impl _<'_>> (changed) + ) + cb=(type_params=(observable_type), event_name) => { + paste::paste! { + #[must_use] + pub fn [](&self) -> ComponentHandle<'_, Target> + { + let ent = self.get_ent_infallible(); + + let Some(comp) = ent.get::() else { + unreachable!(); + }; + + comp + } + + #[must_use] + pub fn [](&self) -> ComponentHandleMut<'_, Target> + { + let ent = self.get_ent_infallible(); + + let Some(comp) = ent.get_mut::() else { + unreachable!(); + }; + + comp + } + } + + #[must_use] + pub fn get_ent_infallible(&self) -> EntityHandle<'_> + { + let Some(ent) = self.get_entity() else { + unreachable!(); + }; + + ent + } + } +); -- cgit v1.2.3-18-g5258