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