diff options
author | HampusM <hampus@hampusmat.com> | 2025-10-15 18:40:19 +0200 |
---|---|---|
committer | HampusM <hampus@hampusmat.com> | 2025-10-15 19:13:21 +0200 |
commit | 7f3072ed7e016dff359439d7580403e36ad6b325 (patch) | |
tree | 706ae1a2e019c577229f1bdc7d1d22cbf1ca9086 /ecs/src/event | |
parent | b3bc691aedb46519e36db8e9eba0e37ac3cefb4a (diff) |
Diffstat (limited to 'ecs/src/event')
-rw-r--r-- | ecs/src/event/component.rs | 51 |
1 files changed, 51 insertions, 0 deletions
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<Target: Component> _<'_><Pair<Removed, Target>> (removed), + impl<Target: Component> _<'_><Pair<Added, Target>> (added), + impl<Target: Component> _<'_><Pair<Changed, Target>> (changed) + ) + cb=(type_params=(observable_type), event_name) => { + paste::paste! { + #[must_use] + pub fn [<get_ $event_name _comp>](&self) -> ComponentHandle<'_, Target> + { + let ent = self.get_ent_infallible(); + + let Some(comp) = ent.get::<Target>() else { + unreachable!(); + }; + + comp + } + + #[must_use] + pub fn [<get_ $event_name _comp_mut>](&self) -> ComponentHandleMut<'_, Target> + { + let ent = self.get_ent_infallible(); + + let Some(comp) = ent.get_mut::<Target>() else { + unreachable!(); + }; + + comp + } + } + + #[must_use] + pub fn get_ent_infallible(&self) -> EntityHandle<'_> + { + let Some(ent) = self.get_entity() else { + unreachable!(); + }; + + ent + } + } +); |