use core::convert::Infallible;
pub(crate) trait IsInfallible {}
impl IsInfallible for Infallible {}
pub trait InfallibleResultExt<T> {
fn infallible_unwrap(self) -> T;
}
impl<T, E> InfallibleResultExt<T> for Result<T, E>
where
E: IsInfallible,
{
fn infallible_unwrap(self) -> T {
match self {
Ok(value) => value,
Err(_) => unreachable!(),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn infallible_unwrap() {
let value: Result<u32, Infallible> = Ok(2);
assert_eq!(2, value.infallible_unwrap());
}
struct AlternativeInfallible {}
impl IsInfallible for AlternativeInfallible {}
#[test]
fn alternative_infallible_unwrap() {
let value: Result<u32, AlternativeInfallible> = Ok(2);
assert_eq!(2, value.infallible_unwrap());
}
}