| Crates.io | bevy_mod_try_system |
| lib.rs | bevy_mod_try_system |
| version | 0.2.0 |
| created_at | 2024-07-01 09:17:23.006243+00 |
| updated_at | 2024-07-15 18:17:13.593597+00 |
| description | An extension trait for Bevy systems that return Results |
| homepage | |
| repository | https://github.com/snendev-labs/bevy_mod_try_system |
| max_upload_size | |
| id | 1288583 |
| size | 30,330 |
This crate defines TrySystemExt, an extension trait implemented on all IntoSystem with Out = Result<Val, Error>. It provides a method, pipe_err, which accepts self and another system (with In = Error) as parameters, and returns a CombinerSystem (the same vehicle behind PipeSystem and the system.pipe method) that passes errors from the first system into the second system.
Assume we intend to call system_a.pipe_err(system_b), where system_a returns some type Result<(), Error>. If we wanted to pipe some output Value from system_a out to a third system_c, we can, as long as system B can provide fallback values of Value when system A returns an Error:
fn system_a() -> Result<Value, Error> {
// ...
}
fn system_b(In(error): In<Error>) -> Value {
// ...
}
fn system_c(In(value): In<Value>) {
// ...
}
fn main() {
App::new()
.add_plugins(DefaultPlugins)
.add_systems(Update, system_a.pipe_err(system_b).pipe(system_c))
.run();
}
Importantly, if system_b cannot provide a fallback value, then this doesn't work very well. However, you can usually be clever, for example returning Option<Value> from system_b and using system.map:
// ...
fn system_b(In(error): In<Error>) -> Value {
// ...
}
// ...
app.add_systems(Update, system_a.map(|result| result.map(|value| Some(value))).pipe_err(system_b).pipe(system_c));
See the tests for more information.