Skip to main content

utils/
panic.rs

1use std::any::Any;
2
3pub fn panic_message(panic: &(dyn Any + Send)) -> &str {
4    panic
5        .downcast_ref::<&str>()
6        .copied()
7        .or_else(|| panic.downcast_ref::<String>().map(String::as_str))
8        .unwrap_or("unknown panic")
9}
10
11#[cfg(test)]
12mod tests {
13    use super::*;
14
15    #[test]
16    fn extracts_formatted_message_from_caught_panic() {
17        let payload = std::panic::catch_unwind(|| panic!("boom {}", 1)).unwrap_err();
18        assert_eq!(panic_message(&*payload), "boom 1");
19    }
20
21    #[test]
22    fn extracts_static_message_from_caught_panic() {
23        let payload = std::panic::catch_unwind(|| panic!("boom")).unwrap_err();
24        assert_eq!(panic_message(&*payload), "boom");
25    }
26}