bevy_mod_try_system

An extension trait for Bevy systems that return Results

4 releases

1.0.0 Jul 1, 2024
0.2.0 Jul 15, 2024
0.1.2 Jul 1, 2024
0.1.1 Jul 1, 2024
0.1.0 Jul 1, 2024


Used in bevy_ui_mod_alerts

MIT/Apache

20KB
374 lines

bevy_mod_try_system

Crates.io Docs

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.

Warnings about chained outputs.

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.

Dependencies

~17MB
~288K SLoC