use ecs::error::Error; use ecs::event::component::{Changed, EventMatchExt}; use ecs::pair::Pair; use ecs::phase::UPDATE; use ecs::query::Query; use ecs::system::observer::Observe; use ecs::{Component, World, error}; use tracing::level_filters::LevelFilter; use tracing_subscriber::EnvFilter; use tracing_subscriber::fmt::time::ChronoLocal; use tracing_subscriber::layer::SubscriberExt; use tracing_subscriber::util::SubscriberInitExt; #[derive(Component)] struct State { value: u32, } fn do_something_fallible(query: Query<(&mut State,)>) -> Result<(), Error> { for (mut state,) in &query { state.value += 1; state.set_changed(); if state.value > 3 { return Err(error!("Invalid state value {}", state.value)); } } Ok(()) } fn handle_state_changed(observe: Observe>) -> Result<(), Error> { for evt_match in &observe { let state = evt_match.get_ent_target_comp(); if state.value > 3 { return Err(error!("Invalid state value {}", state.value)); } tracing::info!("State has valid value {}", state.value); } Ok(()) } fn main() { tracing_subscriber::registry() .with( tracing_subscriber::fmt::layer() .with_timer(ChronoLocal::new("%T%.6f".to_string())), ) .with( EnvFilter::builder() .with_default_directive(LevelFilter::DEBUG.into()) .from_env() .unwrap(), ) .init(); let mut world = World::new(); world.set_err_handler(ecs::error::err_handler_log_error); world.create_entity((State { value: 0 },)); world.register_system(*UPDATE, do_something_fallible); world.register_observer(handle_state_changed); world.step(); world.step(); world.step(); world.step(); }