#![allow(clippy::panic)]
#[track_caller]
pub fn must<T, E: std::fmt::Debug>(r: Result<T, E>) -> T {
match r {
Ok(v) => v,
Err(e) => panic!("unexpected Err<{}>: {e:?}", std::any::type_name::<E>()),
}
}
#[track_caller]
#[must_use]
pub fn must_some<T>(o: Option<T>) -> T {
match o {
Some(v) => v,
None => panic!("unexpected None<{}>", std::any::type_name::<T>()),
}
}
#[track_caller]
#[must_use]
pub fn must_err<T: std::fmt::Debug, E>(r: Result<T, E>) -> E {
match r {
Err(e) => e,
Ok(v) => panic!(
"expected Err<{}>, got Ok<{}>({v:?})",
std::any::type_name::<E>(),
std::any::type_name::<T>()
),
}
}
#[cfg(test)]
mod tests {
use super::{must, must_err, must_some};
#[test]
fn must_unwraps_ok() {
let result: Result<i32, &str> = Ok(42);
assert_eq!(must(result), 42);
}
#[test]
#[should_panic(expected = "unexpected Err")]
fn must_panics_on_err() {
let result: Result<i32, &str> = Err("oops");
must(result);
}
#[test]
fn must_some_unwraps_some() {
assert_eq!(must_some(Some(99)), 99);
}
#[test]
#[should_panic(expected = "unexpected None")]
fn must_some_panics_on_none() {
let _ = must_some(Option::<i32>::None);
}
#[test]
fn must_err_unwraps_err() {
let result: Result<i32, &str> = Err("expected error");
assert_eq!(must_err(result), "expected error");
}
#[test]
#[should_panic(expected = "expected Err")]
fn must_err_panics_on_ok() {
let result: Result<i32, &str> = Ok(1);
let _ = must_err(result);
}
}