#async-await #blocking #proc-macro #removing #procedural #awaits

remove-async-await

一个进程宏,通过删除async和await来使异步函数变为阻塞。

2个稳定版本

1.0.1 2023年3月3日
1.0.0 2023年3月2日

#18 in #removing

每月42次下载
用于lingual

AGPL-3.0

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个宏

  1. remove_async_await:您几乎总是应该使用的宏。使用syn解析Rust代码,并从函数中删除async,从表达式中删除await。目前,它只能接受函数作为输入。
  2. 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