scatter_net/legacy/utils/
spawn_and_forget.rs

1use std::future::Future;
2
3use anyhow::Result;
4use tokio::spawn;
5
6pub fn spawn_and_forget<F, O>(future: F)
7where
8    F: Future<Output = Result<O>> + Send + 'static,
9{
10    spawn(async move {
11        if let Err(err) = future.await {
12            print_error_details(&err);
13        }
14    });
15}
16
17use anyhow::Error;
18
19fn print_error_details(err: &Error) {
20    let mut output = String::new();
21
22    output.push_str(&"-".repeat(80));
23    output.push_str(&format!("\nError: {err}\n"));
24    output.push_str("\nCaused by:\n");
25
26    for (i, cause) in err.chain().enumerate() {
27        output.push_str(&format!("  {i}: {cause}\n"));
28    }
29
30    output.push_str("\nBacktrace:\n");
31    output.push_str(&format!("{}\n", err.backtrace()));
32    output.push_str(&"-".repeat(80));
33
34    eprintln!("{output}\n");
35}