panik 0.2.0

Application-wide panic handling, whereby panics occurring in any thread are treated as a hard error and can be detected by other threads to trigger a graceful exit
Documentation
mod setup;

#[test]
fn multiple_threads() {
    let result = setup::panik_builder().run_and_handle_panics(move || {
        for _ in 0..4 {
            let thread = std::thread::spawn(|| panic!("uh oh"));
            let _ = thread.join();
        }

        panic!("me too")
    });

    assert!(result.is_none());
    assert!(panik::has_panicked());

    let mut panics = panik::panics();
    assert_eq!(panics.len(), 5);

    let main_idx = panics
        .iter()
        .enumerate()
        .find_map(|(idx, p)| {
            if p.thread_id() == std::thread::current().id() {
                Some(idx)
            } else {
                None
            }
        })
        .unwrap();

    let main = panics.remove(main_idx);
    assert_eq!(main.message(), "me too");
    assert!(panics.iter().all(|p| p.message() == "uh oh"));
}