use crate::common::ControllerId; use crate::runtime::Connector; use crate::runtime::Unconfigured; use core::fmt::Debug; mod connector; mod setup; struct Panicked(Box); impl Debug for Panicked { fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { if let Some(str_slice) = self.0.downcast_ref::<&'static str>() { f.pad(str_slice) } else if let Some(string) = self.0.downcast_ref::() { f.pad(string) } else { f.pad("Box") } } } fn handle(result: Result<(), Box<(dyn std::any::Any + Send + 'static)>>) { if let Err(x) = result { panic!("Worker panicked: {:?}", Panicked(x)) } } fn do_all(i: &[&(dyn Fn(&mut Connector) + Sync)]) { let cid_iter = 0..(i.len() as ControllerId); let mut connectors = cid_iter .clone() .map(|controller_id| Connector::Unconfigured(Unconfigured { controller_id })) .collect::>(); let mut results = vec![]; crossbeam_utils::thread::scope(|s| { let handles: Vec<_> = i .iter() .zip(connectors.iter_mut()) .map(|(func, connector)| s.spawn(move |_| func(connector))) .collect(); for h in handles { results.push(h.join()); } }) .unwrap(); let mut failures = false; for ((controller_id, connector), res) in cid_iter.zip(connectors.iter_mut()).zip(results.into_iter()) { println!("\n\n====================\n CID {:?} ...", controller_id); match connector.get_mut_logger() { Some(logger) => println!("{}", logger), None => println!(""), } match res { Ok(()) => println!("CID {:?} OK!", controller_id), Err(e) => { failures = true; println!("CI {:?} PANIC! {:?}", controller_id, Panicked(e)); } }; } if failures { panic!("FAILURES!"); } }