#async-await #blocking #removing #proc-macro #reqwest-client #blocking-client #interface

nb-blocking-util

用于从一个函数中移除所有 async/await 的实用过程宏

2 个版本

0.10.1 2021年11月2日
0.10.0 2021年11月2日

#21 in #reqwest-client


用于 nekosbest

CC0 许可证

9KB
205

nb-blocking-util

用于从函数中移除 async / await 代码的过程宏工具,假设接口提供了被调用函数的异步和阻塞版本。

例如,reqwestreqwest::Clientreqwest::blocking::Client 提供了非常相似的接口,因此通常只需要移除 .await

示例用法

假设你有一个使用 reqwest 客户端获取 https://rust-lang.net.cn/ 的函数

async fn fetch_rust_lang(client: &reqwest::Client) -> Result<String, reqwest::Error> {
    Ok(client.get("https://rust-lang.net.cn/")
        .send()
        .await?
        .error_for_status()?
        .text()
        .await?)
}

现在你想实现一个相同的函数,如果 #[cfg(feature = "blocking")],则该函数为阻塞版本,并且将之前的版本放在 #[cfg(not(feature = "blocking"))] 后面

当然你可以这样做,但这个宏可能会帮助你消除这样的重复

// First expose a ReqwestClient to the function.
#[cfg(not(feature = "blocking"))]
type ReqwestClient = reqwest::Client;
#[cfg(feature = "blocking")]
type ReqwestClient = reqwest::blocking::Client;

// Then the function
async fn fetch_rust_lang(client: &ReqwestClient) -> Result<String, reqwest::Error> {
    Ok(client.get("https://rust-lang.net.cn/")
        .send()
        .await?
        .error_for_status()?
        .text()
        .await?)
}

现在所有剩余的内容都被放在了 #[blocking] 属性后面,如果 #[cfg(feature = "blocking")]

#[cfg_attr(feature = "blocking", nb_blocking_util::blocking)]
async fn fetch_rust_lang(client: &ReqwestClient) -> Result<String, reqwest::Error> {
    Ok(client.get("https://rust-lang.net.cn/")
        .send()
        .await?
        .error_for_status()?
        .text()
        .await?)
}

依赖项

约1.5MB
约35K SLoC