summaryrefslogtreecommitdiff
path: root/ecs/examples/error_handling.rs
diff options
context:
space:
mode:
authorHampusM <hampus@hampusmat.com>2026-05-19 00:12:11 +0200
committerHampusM <hampus@hampusmat.com>2026-05-19 00:12:11 +0200
commitd5a744b0909c4b2bec397ae4dcd43b56aba355c6 (patch)
tree1dcf8b769775ab7a0f4ff87e280aa98a0d280d21 /ecs/examples/error_handling.rs
parentb13b3f6e13f9ac9fe7fee0b5a81b026f411f0301 (diff)
feat(ecs): add error handlingHEADmaster
Diffstat (limited to 'ecs/examples/error_handling.rs')
-rw-r--r--ecs/examples/error_handling.rs79
1 files changed, 79 insertions, 0 deletions
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<Pair<Changed, State>>) -> 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();
+}