2 个版本
0.10.1 | 2021年11月2日 |
---|---|
0.10.0 | 2021年11月2日 |
#21 in #reqwest-client
用于 nekosbest
9KB
205 行
nb-blocking-util
用于从函数中移除 async
/ await
代码的过程宏工具,假设接口提供了被调用函数的异步和阻塞版本。
例如,reqwest
的 reqwest::Client
和 reqwest::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