Skip to main content

elevator_core/query/
mod.rs

1//! ECS-style query builder for iterating entities by component composition.
2//!
3//! # Examples
4//!
5//! ```
6//! use elevator_core::prelude::*;
7//! use elevator_core::query::{Ext, With, Without};
8//!
9//! use serde::{Serialize, Deserialize};
10//!
11//! #[derive(Debug, Clone, Serialize, Deserialize)]
12//! struct VipTag { level: u32 }
13//!
14//! let mut sim = SimulationBuilder::new().build().unwrap();
15//! let rider_eid = sim.spawn_rider_by_stop_id(StopId(0), StopId(1), 75.0).unwrap();
16//!
17//! // Attach an extension component.
18//! sim.world_mut().insert_ext(rider_eid, VipTag { level: 5 }, "vip_tag");
19//!
20//! let world = sim.world();
21//!
22//! // All riders with a position
23//! for (id, rider, pos) in world.query::<(EntityId, &Rider, &Position)>().iter() {
24//!     println!("{id:?}: phase={:?} at {}", rider.phase(), pos.value());
25//! }
26//!
27//! // Entities with Position but without Route
28//! for (id, pos) in world.query::<(EntityId, &Position)>()
29//!     .without::<Route>()
30//!     .iter()
31//! {
32//!     println!("{id:?} at {}", pos.value());
33//! }
34//!
35//! // Extension components (cloned)
36//! for (id, vip) in world.query::<(EntityId, &Ext<VipTag>)>().iter() {
37//!     println!("VIP rider {id:?}: level {}", vip.level);
38//! }
39//! ```
40
41pub(crate) mod storage;
42
43mod fetch;
44mod filter;
45mod iter;
46
47pub use fetch::{Ext, ExtMut, WorldQuery};
48pub use filter::{ExtWith, ExtWithout, QueryFilter, With, Without};
49pub use iter::{ExtQueryMut, QueryBuilder, QueryIter};