JoshMcguigan/multi_try
{ "createdAt": "2019-02-23T03:38:00Z", "defaultBranch": "master", "description": "Safely combine results", "fullName": "JoshMcguigan/multi_try", "homepage": "https://www.joshmcguigan.com/blog/multi-try-improved-validation-logic-rust/", "language": "Rust", "name": "multi_try", "pushedAt": "2024-09-01T18:21:30Z", "stargazersCount": 82, "topics": [], "updatedAt": "2025-10-03T15:43:26Z", "url": "https://github.com/JoshMcguigan/multi_try"}multi_try
Section titled “multi_try”This crate allows you to combine multiple Result types and return either a
tuple containing all of their results, or a Vec of any errors which occurred.
It is useful when you want to provide an error message for all errors rather
than simply returning the first error.
Generics are used to support Result<T, E> for any types of T and E. The
Ok types of the combined results are NOT required to be the same, but all of
the Err types must be the same.
Example
Section titled “Example”use multi_try::MultiTry;
struct A { b: Result<i32, MyErr>, c: Result<i64, MyErr>, d: Result<f32, MyErr>,}
struct ValidatedA { b: i32, c: i64, d: f32,}
enum MyErr { FailedB, FailedC, FailedD,}
fn validate(a: A) -> Result<ValidatedA, Vec<MyErr>> { let (b, c, d) = a.b.and_try(a.c).and_try(a.d)?;
Ok(ValidatedA { b, c, d })}Check the tests directory for additional examples.
License
Section titled “License”Licensed under either of
- Apache License, Version 2.0, ([LICENSE-APACHE]!(LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license ([LICENSE-MIT]!(LICENSE-MIT) or http://opensource.org/licenses/MIT)
at your option.
Contribution
Section titled “Contribution”Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.