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}