Skip to main content

moonshine_object/
name.rs

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