use core::fmt::Display;
use std::panic::PanicHookInfo;
use std::sync::{Arc, OnceLock};
#[cfg_attr(docsrs, doc(cfg(feature = "test-terminator")))]
pub enum TestFailure<'a, E> {
Error(E),
Panic(&'a PanicHookInfo<'a>),
}
#[cfg_attr(docsrs, doc(cfg(feature = "test-terminator")))]
pub struct TestTerminator {
pub(super) lock: Arc<OnceLock<Result<(), super::test_macro::Failure>>>,
pub(super) handle: crate::libuv::AsyncHandle,
}
impl TestTerminator {
pub fn terminate<E: Display>(&self, res: Result<(), TestFailure<'_, E>>) {
if let Ok(()) = self.lock.set(res.map_err(Into::into)) {
self.handle.send().unwrap();
}
}
}