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}