recoverable_spawn/async/
fn.rs

1use crate::*;
2
3/// Executes a recoverable function within a panic-safe context.
4///
5/// # Arguments
6///
7/// - `F` - Function implementing AsyncRecoverableFunction.
8///
9/// # Returns
10///
11/// - `AsyncSpawnResult` - The spawn operation result.
12pub 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
20/// Executes an error-handling function within a panic-safe context.
21///
22/// # Arguments
23///
24/// - `E` - Function implementing AsyncErrorHandlerFunction.
25/// - `Arc<String>` - The error message.
26///
27/// # Returns
28///
29/// - `AsyncSpawnResult` - The spawn operation result.
30pub 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
41/// Converts a panic-captured error value into a string.
42///
43/// # Arguments
44///
45/// - `&JoinError` - The captured error value.
46///
47/// # Returns
48///
49/// - `String` - The error string representation.
50pub fn tokio_error_to_string(err: &JoinError) -> String {
51    err.to_string()
52}
53
54/// Spawns a recoverable function.
55///
56/// # Arguments
57///
58/// - `F` - Function implementing AsyncRecoverableFunction.
59///
60/// # Returns
61///
62/// - `AsyncSpawnResult` - The spawn operation result.
63pub async fn async_recoverable_spawn<F>(function: F) -> AsyncSpawnResult
64where
65    F: AsyncRecoverableFunction,
66{
67    async_run_function(function).await
68}
69
70/// Spawns a recoverable function with error handling.
71///
72/// # Arguments
73///
74/// - `F` - Function implementing AsyncRecoverableFunction.
75/// - `E` - Function implementing AsyncErrorHandlerFunction.
76///
77/// # Returns
78///
79/// - `AsyncSpawnResult` - The spawn operation result.
80pub 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
97/// Spawns a recoverable function with error handling and finalization.
98///
99/// # Arguments
100///
101/// - `F` - Function implementing AsyncRecoverableFunction.
102/// - `E` - Function implementing AsyncErrorHandlerFunction.
103/// - `L` - Function implementing AsyncRecoverableFunction.
104///
105/// # Returns
106///
107/// - `AsyncSpawnResult` - The spawn operation result.
108pub 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}