moonshine_object/name.rs
1use bevy_ecs::name::Name;
2use moonshine_kind::prelude::*;
3
4use crate::{Object, ObjectRef, ObjectWorldRef};
5
6/// [`Object`] methods related to naming.
7///
8/// These methods are available to any [`Object<T>`] or [`ObjectRef<T>`] type.
9pub trait ObjectName {
10 /// Returns the [`Name`] of this object.
11 ///
12 /// # Example
13 /// ```
14 /// # use bevy::prelude::*;
15 /// # use moonshine_object::prelude::*;
16 ///
17 /// let mut app = App::new();
18 /// // ...
19 /// app.add_systems(Update, print_names);
20 ///
21 /// fn print_names(objects: Objects) {
22 /// for object in objects.iter() {
23 /// let entity = object.entity();
24 /// let name = object.name().unwrap_or("Unnamed");
25 /// println!("Entity {entity}, Name = {name}");
26 /// }
27 /// }
28 /// ```
29 ///
30 /// [`Name`]:bevy_ecs::prelude::Name
31 fn name(&self) -> Option<&str>;
32}
33
34impl<T: Kind> ObjectName for Object<'_, '_, '_, T> {
35 fn name(&self) -> Option<&str> {
36 self.nametags
37 .get(self.entity())
38 .ok()
39 .and_then(|(name, _tags)| name.map(|name| name.as_str()))
40 }
41}
42
43impl<T: Kind> ObjectName for ObjectRef<'_, '_, '_, T> {
44 fn name(&self) -> Option<&str> {
45 self.1.name()
46 }
47}
48
49impl<T: Kind> ObjectName for ObjectWorldRef<'_, T> {
50 fn name(&self) -> Option<&str> {
51 self.world
52 .get::<Name>(self.entity())
53 .map(|name| name.as_str())
54 }
55}