yaecs/
entity_builder.rs

1use ::Entity;
2use std::any::Any;
3
4pub struct EntityBuilder(Entity);
5
6impl EntityBuilder {
7    pub fn create(label: String) -> EntityBuilder {
8        EntityBuilder(Entity::new(label))
9    }
10
11    pub fn create_str(label: &str) -> EntityBuilder {
12        EntityBuilder(Entity::new(String::from(label)))
13    }
14
15    pub fn add<T: Any>(mut self, component: T) -> EntityBuilder {
16        self.0.components.insert(component);
17        self
18    }
19
20    pub fn tag(mut self, key: &'static str, value: String) -> EntityBuilder {
21        self.0.tags.insert(key, value);
22        self
23    }
24
25    pub fn build(self) -> Entity {
26        self.0
27    }
28}
29
30#[cfg(test)]
31mod tests {
32    use super::*;
33
34    #[test]
35    fn entity_can_be_built() {
36        let entity = EntityBuilder::create_str("test").build();
37        assert_eq!(entity.label(), "test");
38    }
39
40    #[test]
41    fn entity_add_adds_a_component() {
42        let entity = EntityBuilder::create_str("test").add("String").build();
43        assert_eq!(entity.label(), "test");
44        assert_eq!(entity.components.get::<&str>(), Some(&"String"));
45    }
46
47    #[test]
48    fn entity_tag_adds_a_tag() {
49        let entity = EntityBuilder::create_str("test").tag("key", String::from("value")).build();
50        assert_eq!(entity.label(), "test");
51        assert_eq!(entity.tags.get("key"), Some(&String::from("value")));
52    }
53}