bevy_mod_try_system

Crates.iobevy_mod_try_system
lib.rsbevy_mod_try_system
version0.1.2
sourcesrc
created_at2024-07-01 09:17:23.006243
updated_at2024-07-15 18:17:13.593597
descriptionAn extension trait for Bevy systems that return Results
homepage
repositoryhttps://github.com/snendev-labs/bevy_mod_try_system
max_upload_size
id1288583
size30,100
Sean Sullivan (snendev)

documentation

README

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.

Commit count: 23

cargo fmt