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 #方法
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
模块中的函数中删除所有 async
和 await
,但在 asynchronous
模块中留下它们。因此,您可以在同步或异步上下文中轻松使用这些函数。