#unwrap #expect #syntactic #sugar #panic-message

macro no-std unwrap_all

Unpack multiple levels of Result<T, E> and Option<T> at once

2 unstable releases

0.2.0 Sep 24, 2020
0.1.0 Sep 24, 2020

#2170 in Rust patterns

MIT/Apache

7KB
83 lines

unwrap_all

crates.io docs.rs

With this crate I would like to explore the ergonomics of being able to unwrap multiple levels with one call.

Example unwrap_all!(n_times, expression)

use unwrap_all::unwrap_all;

let nested: Option<Result<Option<Result<usize, ()>>, ()>> = Some(Ok(Some(Ok(42))));

let unpacked = unwrap_all!(4, nested);

assert_eq!(42, unpacked);

Example expect_all!(n_times, message, expression)

Running this function will give you a panic with the message 1 - must fail: 23, where the 1 tells you how many levels in the panic was caused.

use unwrap_all::expect_all;

fn must_fail() {
    let var = Some(Err::<usize, isize>(23));
    let _result: usize = expect_all!(2, "must fail", var);
}

lib.rs:

Unpack multiple levels of Result<T, E> and Option<T> at once

use unwrap_all::unwrap_all;

let nested: Option<Result<Option<Result<usize, ()>>, ()>> = Some(Ok(Some(Ok(42))));
let unpacked = unwrap_all!(4, nested);
assert_eq!(42, unpacked);

This crate should work with no_std too.

Dependencies

~77KB