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}