mise 2024.1.16

The front-end to your dev env
use std::sync::mpsc;
use std::thread;
use std::time::Duration;

use miette::{IntoDiagnostic, Result};

pub fn run_with_timeout<F, T>(f: F, timeout: Duration) -> Result<T>
where
    F: FnOnce() -> Result<T> + Send,
    T: Send,
{
    let (tx, rx) = mpsc::channel();
    thread::scope(|s| {
        s.spawn(move || {
            let result = f();
            // If sending fails, the timeout has already been reached.
            let _ = tx.send(result);
        });
        rx.recv_timeout(timeout) //.context("timed out")
    })
    .into_diagnostic()?
}