async-trait-ext 0.1.1

a procedural macro for async traits
Documentation
use async_trait_ext::async_trait_ext;
use std::task::{Context, Poll};

#[test]
fn test_empty() {
    #[async_trait_ext]
    trait Foo {
        async fn bar();
    }

    struct Baz;

    impl Foo for Baz {
        fn poll_bar(_: &mut Context) -> Poll<()> {
            unimplemented!()
        }
    }

    let _ = async {
        Baz::bar().await;
    };
}

#[test]
fn test_receiver() {
    #[async_trait_ext]
    trait Foo {
        async fn bar(self)
        where
            Self: Copy + Unpin;
        async fn baz(&self);
        async fn qux(&mut self);
    }

    #[derive(Clone, Copy)]
    struct Quux;

    impl Foo for Quux {
        fn poll_bar(self, _: &mut Context) -> Poll<()> {
            unimplemented!()
        }

        fn poll_baz(&self, _: &mut Context) -> Poll<()> {
            unimplemented!()
        }

        fn poll_qux(&mut self, _: &mut Context) -> Poll<()> {
            unimplemented!()
        }
    }

    let _ = async {
        Quux.bar().await;
        Quux.baz().await;
        Quux.qux().await;
    };
}

#[test]
fn test_without_receiver() {
    #[async_trait_ext]
    trait Foo {
        async fn bar(_: i32);
        async fn baz(_: Self, _: i32)
        where
            Self: Copy + Unpin;
    }

    #[derive(Clone, Copy)]
    struct Qux;

    impl Foo for Qux {
        fn poll_bar(_: i32, _: &mut Context) -> Poll<()> {
            unimplemented!()
        }

        fn poll_baz(_: Self, _: i32, _: &mut Context) -> Poll<()> {
            unimplemented!()
        }
    }

    let _ = async {
        Qux::bar(1).await;
        Qux::baz(Qux, 1).await;
    };
}