logo
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
use super::*;

/// Common interface that components expose.
pub trait ComponentTrait: std::fmt::Debug {
    /// 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;

    /// 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 {
                assert!(
                    World::has_component(handle, ComponentType::$component_type),
                    "{:?} lacks component {}",
                    handle,
                    stringify!($component_type),
                );

                $component_type { id: handle }
            }

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