use ecs::event::Event; use ecs::{Component, Query, World}; #[derive(Debug, Component)] struct PettingCapacity { capacity_left: u32, } #[derive(Debug, Clone, Copy, Component)] enum Aggressivity { High, Medium, Low, } #[derive(Debug, Component)] pub struct CatName { name: String, } fn pet_cats(query: Query<(CatName, PettingCapacity, Option)>) { for (cat_name, mut petting_capacity, aggressivity) in &query { let Some(aggressivity) = aggressivity else { println!("Aggressivity of cat {} is unknown. Skipping", cat_name.name); continue; }; if let Aggressivity::High = *aggressivity { println!("Cat {} is aggressive. Skipping", cat_name.name); continue; } if petting_capacity.capacity_left == 0 { println!( "Cat {} have had enough of being petted. Skipping", cat_name.name ); continue; } println!("Petting cat {}", cat_name.name); petting_capacity.capacity_left -= 1; } } #[derive(Debug)] struct PettingTime; impl Event for PettingTime {} fn main() { let mut world = World::new(); world.register_system(PettingTime, pet_cats); world.create_entity(( CatName { name: "Jasper".to_string() }, Aggressivity::Medium, PettingCapacity { capacity_left: 5 }, )); world.create_entity(( CatName { name: "Otto".to_string() }, PettingCapacity { capacity_left: 9 }, )); world.create_entity(( CatName { name: "Carrie".to_string() }, PettingCapacity { capacity_left: 2 }, Aggressivity::High, )); world.create_entity(( CatName { name: "Tommy".to_string() }, PettingCapacity { capacity_left: 1 }, Aggressivity::Low, )); world.prepare(); world.emit(PettingTime); }