1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
use super::*;

/// Common interface that components expose.
pub trait ComponentTrait: std::fmt::Debug + Sized {
    /// The type of the component, as a `ComponentType` enum.
    fn get_type() -> ComponentType;

    /// Adopt an `Entity`, wrap in a component struct.
    fn from_entity(handle: Entity) -> Self;

    /// Try to adopt an `Entity`, wrapping it in a component struct.
    fn try_from_entity(handle: Entity) -> Option<Self>;

    /// Get the entity that the component belongs to.
    fn entity(&self) -> Entity;
}

#[macro_export]
/// Macro for implementing standard component trait
macro_rules! impl_world_component {
    ($component_type: ident) => {
        impl ComponentTrait for $component_type {
            #[inline]
            fn get_type() -> ComponentType {
                ComponentType::$component_type
            }

            #[inline]
            fn from_entity(handle: Entity) -> Self {
                debug_assert!(World::has_component(handle, ComponentType::$component_type), "{:?} lacks component {}", handle, stringify!($component_type));
                $component_type { id: handle }
            }

            #[inline]
            fn try_from_entity(handle: Entity) -> Option<Self> {
                World::has_component(handle, ComponentType::$component_type)
                    .then(|| $component_type { id: handle })
            }

            #[inline]
            fn entity(&self) -> Entity {
                self.id
            }
        }
    };
}