pub trait TryUnwrapResult {
type T;
type E;
fn try_unwrap(self) -> Result<Self::T, Self::E>;
}
impl<T, E> TryUnwrapResult for Result<T, E> {
type T = T;
type E = E;
fn try_unwrap(self) -> Result<T, E> {
if self.is_ok() {
unsafe { Ok(self.unwrap_unchecked()) }
} else {
unsafe { Err(self.unwrap_err_unchecked()) }
}
}
}
pub trait TryUnwrapOption {
type T;
fn try_unwrap(self) -> Option<Self::T>;
}
impl<T> TryUnwrapOption for Option<T> {
type T = T;
fn try_unwrap(self) -> Option<T> {
if self.is_some() {
unsafe { Some(self.unwrap_unchecked()) }
} else {
None
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_result() {
let ok: Result<i32, ()> = Ok(3);
assert_eq!(ok.try_unwrap(), Ok(3));
let err: Result<(), i32> = Err(2);
assert_eq!(err.try_unwrap(), Err(2));
}
#[test]
fn test_option() {
let some: Option<i32> = Some(4);
assert_eq!(some.try_unwrap(), Some(4));
let none: Option<i32> = None;
assert_eq!(none.try_unwrap(), None);
}
}