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.