fn panic_message(payload: Box<dyn std::any::Any + Send>) -> String {
if let Some(message) = payload.downcast_ref::<String>() {
return message.clone();
}
if let Some(message) = payload.downcast_ref::<&str>() {
return (*message).to_string();
}
"unknown panic".to_string()
}
pub(crate) async fn start_mock_server_or_skip() -> Option<wiremock::MockServer> {
match tokio::spawn(async { wiremock::MockServer::start().await }).await {
Ok(server) => Some(server),
Err(err) if err.is_panic() => {
let message = panic_message(err.into_panic());
if message.contains("Operation not permitted") || message.contains("PermissionDenied") {
return None;
}
panic!("mock server should start: {message}");
}
Err(err) => panic!("mock server task should complete: {err}"),
}
}