Crates.io | bevy_mod_try_system |
lib.rs | bevy_mod_try_system |
version | 0.1.2 |
source | src |
created_at | 2024-07-01 09:17:23.006243 |
updated_at | 2024-07-15 18:17:13.593597 |
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,100 |
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.