From d5a744b0909c4b2bec397ae4dcd43b56aba355c6 Mon Sep 17 00:00:00 2001 From: HampusM Date: Tue, 19 May 2026 00:12:11 +0200 Subject: feat(ecs): add error handling --- ecs/examples/error_handling.rs | 79 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 ecs/examples/error_handling.rs (limited to 'ecs/examples') diff --git a/ecs/examples/error_handling.rs b/ecs/examples/error_handling.rs new file mode 100644 index 0000000..dc34c5f --- /dev/null +++ b/ecs/examples/error_handling.rs @@ -0,0 +1,79 @@ +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(); +} -- cgit v1.2.3-18-g5258