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}