2个稳定版本
1.0.1 | 2023年3月3日 |
---|---|
1.0.0 | 2023年3月2日 |
#18 in #removing
每月42次下载
用于lingual
16KB
81 行
remove-async-await
一个进程宏,通过删除async和await来使异步函数变为阻塞。对于需要使用.await
进行某些函数调用的crate来说,非常有用。
添加依赖项
建议将依赖项指向1.0,以便您获得我必须解决的任何错误修复
[dependencies]
remove-async-await = "1.0"
示例
此示例假设您希望将异步API保留在名为async
的可选功能后面。
#[cfg_attr(not(feature = "async"), remove_async_await::remove_async_await)]
async fn get_string() -> String {
"hello world".to_owned()
}
#[cfg_attr(not(feature = "async"), remove_async_await::remove_async_await)]
pub async fn print() {
let string = get_string().await;
println!("{}", string);
}
在此示例中,如果未使用async
功能,则将扩展为以下内容
fn get_string() -> String {
"hello world".to_owned()
}
pub fn print() {
let string = get_string();
println!("{}", string);
}
但是,如果使用async
功能,代码将不受影响。
您可以在tests/
目录中找到更多示例。
remove_async_await_string
此库提供了2个宏
remove_async_await
:您几乎总是应该使用的宏。使用syn
解析Rust代码,并从函数中删除async,从表达式中删除await。目前,它只能接受函数作为输入。remove_async_await_string
:如果您不能使用remove_async_await
,则应仅使用此宏。这是一个“愚昧的宏”;它实际上只是从输入的字符串表示形式中删除了所有async
和.await
的出现。这意味着虽然它可能适用于其他内容,但**您不应该使用它**,因为如果函数或变量名包含“async”或“.await”,则您的代码会损坏。
已知问题
以下是我可能不会修复的已知问题/限制列表(欢迎PR!)
-
问题:
.await
在调用宏时不会被删除解决方案:
-
将使用
.await
的表达式移动到局部变量中。示例
#[remove_async_await::remove_async_await)] async fn issue() { println!("{}", get_string().await); // `.await` will not be removed } #[remove_async_await::remove_async_await)] async fn workaround() { let string = get_string().await; // `.await` **will** be removed println!("{}", string); }
-
使用
remove_async_await_string
(阅读文档获取更多信息,例如潜在的不良副作用)示例
#[remove_async_await::remove_async_await)] async fn issue() { println!("{}", get_string().await); // `.await` will not be removed } #[remove_async_await::remove_async_await_string)] async fn workaround() { println!("{}", get_string().await); // `.await` **will** be removed }
-
如果您想让我将问题添加到此列表(或修复问题),请创建GitHub问题!
依赖项
~1.5MB
~35K SLoC