Crates.io | async_trait_proto |
lib.rs | async_trait_proto |
version | 0.1.0 |
source | src |
created_at | 2022-07-23 17:35:03.610143 |
updated_at | 2022-07-25 16:56:03.056889 |
description | Async traits using nightly features |
homepage | |
repository | |
max_upload_size | |
id | 631632 |
size | 20,911 |
Async trait prototype using the desugarization described in RFC 3185 Static Async Fn in Traits.
It should be faster than async-trait because it doesn't use allocations on every invocation and type erasure.
Requires these feature flags and a nightly compiler:
#![feature(generic_associated_types)]
#![feature(type_alias_impl_trait)]
#![feature(generic_associated_types)]
#![feature(type_alias_impl_trait)]
use async_trait_proto::async_trait_proto;
struct Foo;
#[async_trait_proto]
trait Bar {
async fn wait(&self);
}
#[async_trait_proto]
impl Bar for Foo {
async fn wait(&self) {
sleep(Duration::from_secs(10)).await;
}
}
The trait definition can include attributes that indicate, that the resulting Future has to be Send and/or Sync. This is important when using the traits with work stealing schedulers like tokio.
#![feature(generic_associated_types)]
#![feature(type_alias_impl_trait)]
use async_trait_proto::async_trait_proto;
struct Foo;
#[async_trait_proto]
trait Bar {
#[send]
async fn wait(&self);
}
#[async_trait_proto]
impl Bar for Foo {
async fn wait(&self) {
todo!()
}
}
// this trait can now be used with tokio::spawn
async fn spawn_trait<T: Bar + Sync + Send + 'static>(foo: T) {
let handle = tokio::spawn(async move {
foo.wait().await;
});
handle.await;
}
On the other hand this will not compile:
# #![feature(generic_associated_types)]
# #![feature(type_alias_impl_trait)]
# use async_trait_proto::async_trait_proto;
# struct Foo;
#[async_trait_proto]
trait Bar {
async fn wait(&self);
}
# #[async_trait_proto]
# impl Bar for Foo {
# async fn wait(&self) {
# todo!()
# }
# }
// this trait can not now be used with tokio::spawn
async fn spawn_trait<T: Bar + Sync + Send + 'static>(foo: T) {
let handle = tokio::spawn(async move {
foo.wait().await;
});
handle.await;
}
License: Unlicense