From bf86fdb20c1b983ec12352f51087b65baf196147 Mon Sep 17 00:00:00 2001 From: HampusM Date: Wed, 29 Apr 2026 17:19:34 +0200 Subject: refactor(ecs): add ext trait for component event EventMatch fns --- ecs/src/event/component.rs | 126 ++++++++++++++++++++++++++++----------------- 1 file changed, 79 insertions(+), 47 deletions(-) (limited to 'ecs/src/event/component.rs') diff --git a/ecs/src/event/component.rs b/ecs/src/event/component.rs index ed6b7cf..70ea3e5 100644 --- a/ecs/src/event/component.rs +++ b/ecs/src/event/component.rs @@ -2,12 +2,14 @@ use std::convert::Infallible; +use crate::Component; 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; +use crate::system::observer::{EventMatch, Observed}; + +/// Implemented by the relations of component event pairs +pub trait EventRelation: Component {} /// Pair relation for events emitted when: /// a) A entity with the target component is spawned. @@ -15,57 +17,87 @@ use crate::Component; #[derive(Debug, Component)] pub struct Added(Infallible); +impl EventRelation for Added {} + /// Pair relation for events emitted **before**: /// a) The target component is removed from a entity. /// b) A entity with the target component is despawned. #[derive(Debug, Component)] pub struct Removed(Infallible); +impl EventRelation for Removed {} + #[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 - } +impl EventRelation for Changed {} + +/// [`EventMatch`] extension trait for component event matches. +pub trait EventMatchExt: sealed::Sealed +{ + #[must_use] + fn get_entity(&self) -> EntityHandle<'_>; + + #[must_use] + fn get_ent_target_comp(&self) -> ComponentHandle<'_, Target> + where + Target: Component; + + #[must_use] + fn get_ent_target_comp_mut(&self) -> ComponentHandleMut<'_, Target> + where + Target: Component; +} + +impl EventMatchExt + for EventMatch<'_, Pair> +where + Pair: Observed, +{ + fn get_entity(&self) -> EntityHandle<'_> + { + let Some(ent) = self.try_get_entity() else { + unreachable!(); + }; + + ent } -); + + fn get_ent_target_comp(&self) -> ComponentHandle<'_, Target> + where + Target: Component, + { + let ent = self.get_entity(); + + let Some(comp) = ent.get::() else { + unreachable!(); + }; + + comp + } + + fn get_ent_target_comp_mut(&self) -> ComponentHandleMut<'_, Target> + where + Target: Component, + { + let ent = self.get_entity(); + + let Some(comp) = ent.get_mut::() else { + unreachable!(); + }; + + comp + } +} + +impl sealed::Sealed + for EventMatch<'_, Pair> +where + Pair: Observed, +{ +} + +mod sealed +{ + pub trait Sealed {} +} -- cgit v1.2.3-18-g5258