#retry #macro #tokio #declarative-macro #async #sync

retry_macro

一组声明性宏,在失败时重新执行函数。

5 个版本

0.2.0 2022 年 12 月 23 日
0.1.5 2022 年 11 月 17 日

#2255Rust 模式

Download history 5/week @ 2024-04-02

144 每月下载量

MIT/Apache

15KB
273

retry_macro

一个库,提供自动在失败时重新执行同步和异步(tokio 带睡眠)函数的宏。

功能标志

如果您想使用 retry_async_sleep 宏,请启用 features = ["tokio"]

示例

以下是用同步和异步宏的简单示例。请注意,所有函数输入都必须 绑定到一个标识符(变量)。

同步

use retry_macro::{retry, retry_sleep, RetryError};

fn can_fail(input: &str) -> Result<i32, std::num::ParseIntError> {
    input.parse::<i32>()
}

fn main() {
    // Retry the can_fail function 5 times with the input "not_a_number"
    let var = "not_a_number";
    let res = retry!(5, can_fail, var);
    assert!(res.is_err());
    assert_eq!(res.unwrap_err().retries.len(), 5);

    // Retry the can_fail function 5 times with the input "not_a_number", sleep for 100 milliseconds between retries
    let var = "not_a_number";
    let res = retry_sleep!(5, 100, can_fail, var);
    assert!(res.is_err());
    assert_eq!(res.unwrap_err().retries.len(), 5);
}

异步

use retry_macro::{retry_async, retry_async_sleep, RetryError};

async fn can_fail_async(input: &str) -> Result<i32, std::num::ParseIntError> {
    tokio::time::sleep(tokio::time::Duration::from_millis(1)).await;
    input.parse::<i32>()
}

#[tokio::main]
async fn main() {
    // Retry the can_fail function 5 times with the input "not_a_number"
    let var = "not_a_number";
    let res = retry_async!(5, can_fail_async, var);
    assert!(res.is_err());
    assert_eq!(res.unwrap_err().retries.len(), 5);

    // Retry the can_fail function 5 times with the input "not_a_number", sleep for 100 milliseconds between retries
    let var = "not_a_number";
    let res = retry_async_sleep!(5, 100, can_fail_async, var);
    assert!(res.is_err());
    assert_eq!(res.unwrap_err().retries.len(), 5);
}

许可证

retry_macroMITApache-2.0 许可下分发。

依赖关系

~0–1.3MB
~22K SLoC