Skip to content

Commit 6f08bb8

Browse files
Exposes Observer's system's name (#19611)
# Objective Fixes #18726 Alternative to and closes #18797 ## Solution Create a method `Observer::system_name` to expose the name of the `Observer`'s system ## Showcase ```rust // Returns `my_crate::my_observer` let observer = Observer::new(my_observer); println!(observer.system_name()); // Returns `my_crate::method::{{closure}}` let observer = Observer::new(|_trigger: Trigger<...>|); println!(observer.system_name()); // Returns `custom_name` let observer = Observer::new(IntoSystem::into_system(my_observer).with_name("custom_name")); println!(observer.system_name()); ``` ## TODO - [ ] Achieve cart's approval --------- Co-authored-by: Alice Cecile <[email protected]>
1 parent f3e7a4b commit 6f08bb8

File tree

3 files changed

+32
-12
lines changed

3 files changed

+32
-12
lines changed

crates/bevy_ecs/src/observer/runner.rs

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use alloc::{boxed::Box, vec};
1+
use alloc::{borrow::Cow, boxed::Box, vec};
22
use core::any::Any;
33

44
use crate::{
@@ -194,7 +194,7 @@ pub type ObserverRunner = fn(DeferredWorld, ObserverTrigger, PtrMut, propagate:
194194
pub struct Observer {
195195
hook_on_add: ComponentHook,
196196
error_handler: Option<ErrorHandler>,
197-
system: Box<dyn Any + Send + Sync + 'static>,
197+
system: Box<dyn AnyNamedSystem>,
198198
pub(crate) descriptor: ObserverDescriptor,
199199
pub(crate) last_trigger_id: u32,
200200
pub(crate) despawned_watched_entities: u32,
@@ -232,7 +232,7 @@ impl Observer {
232232
/// Creates a new [`Observer`] with custom runner, this is mostly used for dynamic event observer
233233
pub fn with_dynamic_runner(runner: ObserverRunner) -> Self {
234234
Self {
235-
system: Box::new(|| {}),
235+
system: Box::new(IntoSystem::into_system(|| {})),
236236
descriptor: Default::default(),
237237
hook_on_add: |mut world, hook_context| {
238238
let default_error_handler = world.default_error_handler();
@@ -299,6 +299,11 @@ impl Observer {
299299
pub fn descriptor(&self) -> &ObserverDescriptor {
300300
&self.descriptor
301301
}
302+
303+
/// Returns the name of the [`Observer`]'s system .
304+
pub fn system_name(&self) -> Cow<'static, str> {
305+
self.system.system_name()
306+
}
302307
}
303308

304309
impl Component for Observer {
@@ -364,7 +369,8 @@ fn observer_system_runner<E: Event, B: Bundle, S: ObserverSystem<E, B>>(
364369
// - observer was triggered so must have an `Observer` component.
365370
// - observer cannot be dropped or mutated until after the system pointer is already dropped.
366371
let system: *mut dyn ObserverSystem<E, B> = unsafe {
367-
let system = state.system.downcast_mut::<S>().debug_checked_unwrap();
372+
let system: &mut dyn Any = state.system.as_mut();
373+
let system = system.downcast_mut::<S>().debug_checked_unwrap();
368374
&mut *system
369375
};
370376

@@ -413,6 +419,16 @@ fn observer_system_runner<E: Event, B: Bundle, S: ObserverSystem<E, B>>(
413419
}
414420
}
415421

422+
trait AnyNamedSystem: Any + Send + Sync + 'static {
423+
fn system_name(&self) -> Cow<'static, str>;
424+
}
425+
426+
impl<T: Any + System> AnyNamedSystem for T {
427+
fn system_name(&self) -> Cow<'static, str> {
428+
self.name()
429+
}
430+
}
431+
416432
/// A [`ComponentHook`] used by [`Observer`] to handle its [`on-add`](`crate::lifecycle::ComponentHooks::on_add`).
417433
///
418434
/// This function exists separate from [`Observer`] to allow [`Observer`] to have its type parameters
@@ -431,11 +447,12 @@ fn hook_on_add<E: Event, B: Bundle, S: ObserverSystem<E, B>>(
431447
B::component_ids(&mut world.components_registrator(), &mut |id| {
432448
components.push(id);
433449
});
434-
if let Some(mut observe) = world.get_mut::<Observer>(entity) {
435-
observe.descriptor.events.push(event_id);
436-
observe.descriptor.components.extend(components);
450+
if let Some(mut observer) = world.get_mut::<Observer>(entity) {
451+
observer.descriptor.events.push(event_id);
452+
observer.descriptor.components.extend(components);
437453

438-
let system: *mut dyn ObserverSystem<E, B> = observe.system.downcast_mut::<S>().unwrap();
454+
let system: &mut dyn Any = observer.system.as_mut();
455+
let system: *mut dyn ObserverSystem<E, B> = system.downcast_mut::<S>().unwrap();
439456
// SAFETY: World reference is exclusive and initialize does not touch system, so references do not alias
440457
unsafe {
441458
(*system).initialize(world);

crates/bevy_ecs/src/system/schedule_system.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,6 @@ where
137137
T: Send + Sync + 'static,
138138
{
139139
type In = ();
140-
141140
type Out = S::Out;
142141

143142
fn name(&self) -> Cow<'static, str> {
@@ -231,7 +230,6 @@ where
231230
T: FromWorld + Send + Sync + 'static,
232231
{
233232
type In = ();
234-
235233
type Out = S::Out;
236234

237235
fn name(&self) -> Cow<'static, str> {

release-content/release-notes/observer_overhaul.md

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
---
22
title: Observer Overhaul
3-
authors: ["@Jondolf", "@alice-i-cecile"]
4-
pull_requests: [19596, 19663]
3+
authors: ["@Jondolf", "@alice-i-cecile", "@hukasu]
4+
pull_requests: [19596, 19663, 19611]
55
---
66

77
## Rename `Trigger` to `On`
@@ -40,3 +40,8 @@ allowing you to bubble events up your hierarchy to see if any of the parents car
4040
then act on the entity that was actually picked in the first place.
4141

4242
This was handy! We've enabled this functionality for all entity-events: simply call `On::original_target`.
43+
44+
## Expose name of the Observer's system
45+
46+
The name of the Observer's system is now accessible through `Observer::system_name`,
47+
this opens up the possibility for the debug tools to show more meaningful names for observers.

0 commit comments

Comments
 (0)