Documentation
#[macro_export]
macro_rules! guarded_unwrap {
    (@inner $expr:expr, $none_case:expr) => {
        match guarded::GuardedUnwrap::guarded_unwrap_inner($expr) {
            Some(value) => value,
            None => $none_case,
        }
    };

    ($expr:expr, return $ret:expr) => {
        guarded_unwrap!(@inner $expr, { return $ret; })
    };

    ($expr:expr, return) => {
        guarded_unwrap!(@inner $expr, { return; })
    };

    ($expr:expr, break $ret:expr) => {
        guarded_unwrap!(@inner $expr, { break $ret; })
    };

    ($expr:expr, break) => {
        guarded_unwrap!(@inner $expr, { break; })
    };

    ($expr:expr, continue $ret:expr) => {
        guarded_unwrap!(@inner $expr, { continue $ret; })
    };

    ($expr:expr, continue) => {
        guarded_unwrap!(@inner $expr, { continue; })
    };
}

pub trait GuardedUnwrap<T> {
    fn guarded_unwrap_inner(self) -> Option<T>;
}

impl<T> GuardedUnwrap<T> for Option<T> {
    fn guarded_unwrap_inner(self) -> Option<T> {
        self
    }
}

impl<T, E> GuardedUnwrap<T> for Result<T, E> {
    fn guarded_unwrap_inner(self) -> Option<T> {
        match self {
            Ok(value) => Some(value),
            Err(_) => None
        }
    }
}