use std::io;
use tokio::runtime::Runtime;
pub fn runtime() -> io::Result<Runtime> {
tokio::runtime::Builder::new_current_thread()
.enable_all()
.build()
}
pub fn spawn(name: &str, run: impl FnOnce(Runtime) + Send + 'static) -> io::Result<()> {
let rt = runtime()?;
std::thread::Builder::new()
.name(name.to_owned())
.spawn(move || run(rt))?;
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn a_worker_runs_its_future_on_the_named_thread() {
let (report, reported) = std::sync::mpsc::channel();
spawn("openlogi-test-worker", move |runtime| {
runtime.block_on(async {
let _ = report.send(std::thread::current().name().map(str::to_owned));
});
})
.expect("a worker thread starts");
assert_eq!(
reported.recv().expect("the worker reports").as_deref(),
Some("openlogi-test-worker")
);
}
}