| Crates.io | nb-blocking-util |
| lib.rs | nb-blocking-util |
| version | 0.10.2 |
| created_at | 2021-11-02 17:25:54.77637+00 |
| updated_at | 2025-05-18 10:39:23.304839+00 |
| description | Utility proc macro for removing all async/await from a function |
| homepage | |
| repository | https://github.com/nekos-best/nekos-best.rs |
| max_upload_size | |
| id | 475808 |
| size | 10,169 |
nb-blocking-utilProcedural macro utility for removing async / await code from a function, assuming the interfaces have both an async and a blocking version of the functions called.
For example, reqwest's reqwest::Client and reqwest::blocking::Client expose a very similar interface, so often it is enough to just remove .awaits.
Let's say you have a function that fetches https://rust-lang.org/, by using a reqwest client:
async fn fetch_rust_lang(client: &reqwest::Client) -> Result<String, reqwest::Error> {
Ok(client.get("https://rust-lang.org/")
.send()
.await?
.error_for_status()?
.text()
.await?)
}
And now you want to implement the same function if #[cfg(feature = "blocking")], but blocking, gating the previous behind #[cfg(not(feature = "blocking"))]
Of course you can do that, but this macro may help you get rid of duplicates like that:
// 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.org/")
.send()
.await?
.error_for_status()?
.text()
.await?)
}
And now everything left is put it behind
the #[blocking] attribute if #[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.org/")
.send()
.await?
.error_for_status()?
.text()
.await?)
}