use crate::*;
pub async fn async_run_function<F: AsyncRecoverableFunction>(func: F) -> AsyncSpawnResult {
set_hook(Box::new(move |_| {}));
let func = async move {
func.call().await;
};
tokio::spawn(func).await
}
pub async fn async_run_error_handle_function<E: AsyncErrorHandlerFunction>(
func: E,
error: Arc<String>,
) -> AsyncSpawnResult {
set_hook(Box::new(move |_| {}));
let func = async move {
func.call(error.clone()).await;
};
tokio::spawn(func).await
}
pub fn tokio_error_to_string(err: &JoinError) -> String {
err.to_string()
}
pub async fn async_recoverable_spawn<F>(function: F) -> AsyncSpawnResult
where
F: AsyncRecoverableFunction,
{
async_run_function(function).await
}
pub async fn async_recoverable_spawn_catch<F, E>(
function: F,
error_handle_function: E,
) -> AsyncSpawnResult
where
F: AsyncRecoverableFunction,
E: AsyncErrorHandlerFunction,
{
let run_result: AsyncSpawnResult = async_run_function(function).await;
if let Err(err) = run_result.as_ref() {
let err_string: String = tokio_error_to_string(err);
let _: AsyncSpawnResult =
async_run_error_handle_function(error_handle_function, Arc::new(err_string)).await;
}
run_result
}
pub async fn async_recoverable_spawn_catch_finally<F, E, L>(
function: F,
error_handle_function: E,
finally: L,
) -> AsyncSpawnResult
where
F: AsyncRecoverableFunction,
E: AsyncErrorHandlerFunction,
L: AsyncRecoverableFunction,
{
let run_result: AsyncSpawnResult = async_run_function(function).await;
if let Err(err) = run_result.as_ref() {
let err_string: String = tokio_error_to_string(err);
let _: AsyncSpawnResult =
async_run_error_handle_function(error_handle_function, Arc::new(err_string)).await;
}
let _: AsyncSpawnResult = async_run_function(finally).await;
run_result
}