use sky_ecs::dynamic::{DynamicBundle, DynamicQueryBuilder, WorldDynamicExt};
use sky_ecs::World;
#[derive(Debug, PartialEq)]
struct Position(i32);
#[derive(Debug)]
struct Velocity(i32);
fn main() {
let mut world = World::new();
let entity = world
.spawn_dynamic(DynamicBundle::new().with(Position(10)).with(Velocity(3)))
.expect("dynamic bundle should contain unique component types");
let mut update = DynamicQueryBuilder::new()
.write::<Position>()
.read::<Velocity>()
.build()
.unwrap();
update
.for_each_chunk_mut(&mut world, |mut chunk| {
let (positions, velocities) = chunk.write_read::<Position, Velocity>(0, 1)?;
for (position, velocity) in positions.iter_mut().zip(velocities) {
position.0 += velocity.0;
}
Ok(())
})
.unwrap();
assert_eq!(world.get::<Position>(entity), Some(&Position(13)));
let mut inspect = DynamicQueryBuilder::new()
.read::<Position>()
.build()
.unwrap();
let mut checksum = 0;
inspect
.for_each_chunk(&world, |chunk| {
checksum += chunk
.read::<Position>(0)?
.iter()
.map(|value| value.0)
.sum::<i32>();
Ok(())
})
.unwrap();
assert_eq!(checksum, 13);
let duplicate = DynamicQueryBuilder::new()
.read::<Position>()
.write::<Position>()
.build();
let error = match duplicate {
Ok(_) => panic!("duplicate slots must be rejected"),
Err(error) => error,
};
assert!(error.to_string().contains("duplicate component"));
println!("step 08: dynamic slots updated Position and rejected an invalid query");
}