4 个版本

0.2.2 2024年2月8日
0.2.1 2024年2月8日
0.2.0 2024年2月8日
0.1.0 2024年2月8日

#12 in #方法

MIT/Apache

7KB

bisync

轻松同时编写同步和异步代码。

这个包受到了 maybe-async 的启发,但采用了不同的方法,并试图更加极简。

如何使用它?

使用 #[bisync] 注释您希望具有异步泛型的函数。您可以通过使用 #[only_sync]#[only_async] 注释来专门化函数。

您需要在父模块中添加少量模板代码,但这就是全部。

示例

// lib.rs

#[path = "."]
pub mod asynchronous {
    use bisync::asynchronous::*;
    mod inner;
    pub use inner::*;
}

// here you could also add `#[cfg]` attributes to enable or disable this module
#[path = "."]
pub mod blocking {
    use bisync::synchronous::*;
    mod inner;
    pub use inner::*;
}
// inner.rs

// these are all the available definitions:
use super::{bisync, only_sync, only_async, SYNC, ASYNC};
 
#[bisync]
pub async fn foo() -> String {
    bar().await
}
 
#[bisync]
async fn bar() -> String {
    if ASYNC {
        println!("We are in async code.");
    } else if SYNC {
        println!("We are in blocking code.");
    } else {
        panic!("This is neither async nor blocking code but a secret third thing.");
    }
 
    baz().await
}
 
#[only_sync]
fn baz() -> String {
    ureq::get("https://example.com")
        .call()
        .unwrap()
        .into_string()
        .unwrap()
}
 
#[only_async]
async fn baz() -> String {
    reqwest::get("https://example.com")
        .await
        .unwrap()
        .text()
        .await
        .unwrap()
}

上面的示例将从 blocking 模块中的函数中删除所有 asyncawait,但在 asynchronous 模块中留下它们。因此,您可以在同步或异步上下文中轻松使用这些函数。

依赖关系