try_wrap_ok/
lib.rs

1//! This crate provides a macro similar to the old `try!` macro, or to the `?`, except it wraps
2//! the error in an additional Ok.
3//!
4//! This is useful if you want to use a `?` for easily returning say, invalid input errors,
5//! but you can't do so because you have an additional `Result` level for handling internal errors of a different nature.
6//!
7//! This macro allows you to do so:
8//!
9//! ```
10//! fn foo(input: Input) -> Result<Result<FinalOutput, InvalidInputError>, DatabaseError> {
11//!     let validated_input: ValidatedInput = try_wrap_ok!(validate_input_with_database(input)?);
12//!     Ok(Ok(do_stuff_with_validated_input(validated_input)?))
13//! }
14//!
15//! fn validate_input_with_database(input: Input) -> Result<Result<ValidatedInput, InvalidInputError>, DatabaseError>;
16//! ```
17
18#[macro_export]
19/// Helper macro to wrap `?` into an `Ok`
20///
21/// # Example
22/// ```
23/// fn foo(input: Input) -> Result<Result<FinalOutput, InvalidInputError>, DatabaseError> {
24///     let validated_input: ValidatedInput = try_wrap_ok!(validate_input_with_database(input)?);
25///     Ok(Ok(do_stuff_with_validated_input(validated_input)?))
26/// }
27///
28/// fn validate_input_with_database(input: Input) -> Result<Result<ValidatedInput, InvalidInputError>, DatabaseError>;
29/// ````
30macro_rules! try_wrap_ok {
31    ($expr:expr) => {
32        match $expr {
33            std::result::Result::Ok(val) => val,
34            std::result::Result::Err(err) => {
35                return Ok(std::result::Result::Err(std::convert::From::from(err)))
36            }
37        }
38    };
39}