bevy/crates
JaySpruce ee4414159b
Add Result handling to Commands and EntityCommands (#17043)
## Objective

Fixes #2004
Fixes #3845
Fixes #7118
Fixes #10166

## Solution

- The crux of this PR is the new `Command::with_error_handling` method.
This wraps the relevant command in another command that, when applied,
will apply the original command and handle any resulting errors.
- To enable this, `Command::apply` and `EntityCommand::apply` now return
`Result`.
- `Command::with_error_handling` takes as a parameter an error handler
of the form `fn(&mut World, CommandError)`, which it passes the error
to.
- `CommandError` is an enum that can be either `NoSuchEntity(Entity)` or
`CommandFailed(Box<dyn Error>)`.

### Closures
- Closure commands can now optionally return `Result`, which will be
passed to `with_error_handling`.

### Commands
- Fallible commands can be queued with `Commands::queue_fallible` and
`Commands::queue_fallible_with`, which call `with_error_handling` before
queuing them (using `Commands::queue` will queue them without error
handling).
- `Commands::queue_fallible_with` takes an `error_handler` parameter,
which will be used by `with_error_handling` instead of a command's
default.
- The `command` submodule provides unqueued forms of built-in fallible
commands so that you can use them with `queue_fallible_with`.
- There is also an `error_handler` submodule that provides simple error
handlers for convenience.

### Entity Commands
- `EntityCommand` now automatically checks if the entity exists before
executing the command, and returns `NoSuchEntity` if it doesn't.
- Since all entity commands might need to return an error, they are
always queued with error handling.
- `EntityCommands::queue_with` takes an `error_handler` parameter, which
will be used by `with_error_handling` instead of a command's default.
- The `entity_command` submodule provides unqueued forms of built-in
entity commands so that you can use them with `queue_with`.

### Defaults
- In the future, commands should all fail according to the global error
handling setting. That doesn't exist yet though.
- For this PR, commands all fail the way they do on `main`.
- Both now and in the future, the defaults can be overridden by
`Commands::override_error_handler` (or equivalent methods on
`EntityCommands` and `EntityEntryCommands`).
- `override_error_handler` takes an error handler (`fn(&mut World,
CommandError)`) and passes it to every subsequent command queued with
`Commands::queue_fallible` or `EntityCommands::queue`.
- The `_with` variants of the queue methods will still provide an error
handler directly to the command.
- An override can be reset with `reset_error_handler`.

## Future Work

- After a universal error handling mode is added, we can change all
commands to fail that way by default.
- Once we have all commands failing the same way (which would require
either the full removal of `try` variants or just making them useless
while they're deprecated), `queue_fallible_with_default` could be
removed, since its only purpose is to enable commands having different
defaults.
2025-01-07 16:50:52 +00:00
..
bevy_a11y Update all previously-merged #![deny(clippy::allow_attributes, clippy::allow_attributes_without_reason)] attributes to include a reason field pointing to the tracking issue (#17136) 2025-01-06 05:40:08 +00:00
bevy_animation Update all previously-merged #![deny(clippy::allow_attributes, clippy::allow_attributes_without_reason)] attributes to include a reason field pointing to the tracking issue (#17136) 2025-01-06 05:40:08 +00:00
bevy_app Fix depth_bias and build errors on less capable platforms (#17079) 2025-01-06 18:39:08 +00:00
bevy_asset bevy_asset: Apply #![deny(clippy::allow_attributes, clippy::allow_attributes_without_reason)] (#17113) 2025-01-06 19:25:47 +00:00
bevy_audio bevy_audio: Apply #![deny(clippy::allow_attributes, clippy::allow_attributes_without_reason)] (#17119) 2025-01-06 19:09:08 +00:00
bevy_color Add the original source for Oklab conversions (#17199) 2025-01-07 00:41:33 +00:00
bevy_core_pipeline Remove bevy_core_pipeline::core_2d::Camera2dBundle (#17185) 2025-01-06 19:29:14 +00:00
bevy_derive Bump Version after Release (#17176) 2025-01-06 00:04:44 +00:00
bevy_dev_tools Upstream DebugPickingPlugin from bevy_mod_picking (#17177) 2025-01-07 05:19:50 +00:00
bevy_diagnostic bevy_diagnostic: Apply #![deny(clippy::allow_attributes, clippy::allow_attributes_without_reason)] (#17186) 2025-01-06 19:29:59 +00:00
bevy_dylib Bump Version after Release (#17176) 2025-01-06 00:04:44 +00:00
bevy_ecs Add Result handling to Commands and EntityCommands (#17043) 2025-01-07 16:50:52 +00:00
bevy_encase_derive Bump Version after Release (#17176) 2025-01-06 00:04:44 +00:00
bevy_gilrs Bump Version after Release (#17176) 2025-01-06 00:04:44 +00:00
bevy_gizmos Bump Version after Release (#17176) 2025-01-06 00:04:44 +00:00
bevy_gltf Bump Version after Release (#17176) 2025-01-06 00:04:44 +00:00
bevy_hierarchy Add Result handling to Commands and EntityCommands (#17043) 2025-01-07 16:50:52 +00:00
bevy_image Bump Version after Release (#17176) 2025-01-06 00:04:44 +00:00
bevy_input Bump Version after Release (#17176) 2025-01-06 00:04:44 +00:00
bevy_input_focus Add basic directional (gamepad) navigation for UI (and non-UI) (#17102) 2025-01-06 18:51:44 +00:00
bevy_internal Fix depth_bias and build errors on less capable platforms (#17079) 2025-01-06 18:39:08 +00:00
bevy_log Bump Version after Release (#17176) 2025-01-06 00:04:44 +00:00
bevy_macro_utils Bump Version after Release (#17176) 2025-01-06 00:04:44 +00:00
bevy_math Add basic directional (gamepad) navigation for UI (and non-UI) (#17102) 2025-01-06 18:51:44 +00:00
bevy_mesh Bump Version after Release (#17176) 2025-01-06 00:04:44 +00:00
bevy_mikktspace Bump Version after Release (#17176) 2025-01-06 00:04:44 +00:00
bevy_pbr Remove references to old sample_texture function (#17195) 2025-01-07 00:44:17 +00:00
bevy_picking Bump Version after Release (#17176) 2025-01-06 00:04:44 +00:00
bevy_ptr Bump Version after Release (#17176) 2025-01-06 00:04:44 +00:00
bevy_reflect Fix depth_bias and build errors on less capable platforms (#17079) 2025-01-06 18:39:08 +00:00
bevy_remote Bump Version after Release (#17176) 2025-01-06 00:04:44 +00:00
bevy_render bevy_render: Apply #![deny(clippy::allow_attributes, clippy::allow_attributes_without_reason)] (#17194) 2025-01-06 23:10:58 +00:00
bevy_scene Bump Version after Release (#17176) 2025-01-06 00:04:44 +00:00
bevy_sprite bevy_sprite: Apply #![deny(clippy::allow_attributes, clippy::allow_attributes_without_reason)] (Attempt 2) (#17184) 2025-01-06 19:26:44 +00:00
bevy_state Bump Version after Release (#17176) 2025-01-06 00:04:44 +00:00
bevy_tasks Update all previously-merged #![deny(clippy::allow_attributes, clippy::allow_attributes_without_reason)] attributes to include a reason field pointing to the tracking issue (#17136) 2025-01-06 05:40:08 +00:00
bevy_text Add builder method for TextFont::line_height (#17203) 2025-01-07 00:40:00 +00:00
bevy_time Bump Version after Release (#17176) 2025-01-06 00:04:44 +00:00
bevy_transform Bump Version after Release (#17176) 2025-01-06 00:04:44 +00:00
bevy_ui Simplified UI tree navigation without ghost_nodes (#17143) 2025-01-06 19:22:00 +00:00
bevy_utils Bump Version after Release (#17176) 2025-01-06 00:04:44 +00:00
bevy_window can hide status bar on iOS (#17179) 2025-01-06 19:19:56 +00:00
bevy_winit iOS: can change home indicator / status bar during runtime (#17204) 2025-01-07 01:07:18 +00:00