recoverable_spawn/thread/async/
fn.rs1use crate::*;
2use tokio::task::JoinError;
3
4pub async fn async_run_function<F: AsyncRecoverableFunction>(func: F) -> AsyncSpawnResult {
14 set_hook(Box::new(move |_| {}));
15 let func = async move {
16 func.call().await;
17 };
18 tokio::spawn(func).await
19}
20
21pub async fn async_run_error_handle_function<E: AsyncErrorHandlerFunction>(
32 func: E,
33 error: Arc<String>,
34) -> AsyncSpawnResult {
35 set_hook(Box::new(move |_| {}));
36 let func = async move {
37 func.call(error.clone()).await;
38 };
39 tokio::spawn(func).await
40}
41
42pub fn tokio_error_to_string(err: &JoinError) -> String {
52 err.to_string()
53}
54
55pub async fn async_recoverable_spawn<F>(function: F) -> AsyncSpawnResult
65where
66 F: AsyncRecoverableFunction,
67{
68 async_run_function(function).await
69}
70
71pub async fn async_recoverable_spawn_catch<F, E>(
82 function: F,
83 error_handle_function: E,
84) -> AsyncSpawnResult
85where
86 F: AsyncRecoverableFunction,
87 E: AsyncErrorHandlerFunction,
88{
89 let run_result: AsyncSpawnResult = async_run_function(function).await;
90 if let Err(err) = run_result.as_ref() {
91 let err_string: String = tokio_error_to_string(err);
92 let _: AsyncSpawnResult =
93 async_run_error_handle_function(error_handle_function, Arc::new(err_string)).await;
94 }
95 run_result
96}
97
98pub async fn async_recoverable_spawn_catch_finally<F, E, L>(
110 function: F,
111 error_handle_function: E,
112 finally: L,
113) -> AsyncSpawnResult
114where
115 F: AsyncRecoverableFunction,
116 E: AsyncErrorHandlerFunction,
117 L: AsyncRecoverableFunction,
118{
119 let run_result: AsyncSpawnResult = async_run_function(function).await;
120 if let Err(err) = run_result.as_ref() {
121 let err_string: String = tokio_error_to_string(err);
122 let _: AsyncSpawnResult =
123 async_run_error_handle_function(error_handle_function, Arc::new(err_string)).await;
124 }
125 let _: AsyncSpawnResult = async_run_function(finally).await;
126 run_result
127}