macro_rules! easy_wrapper {
    (
        $(#[$meta:meta])*
        $vis:vis struct $name:ident

        $(<
            $( $lifetime:lifetime $(: $lifetime_bound:lifetime)? ),* $(,)?
            $( $generics:ident
                $(: $generics_bound:path)?
                $(: ?$generics_unsized_bound:path)?
                $(: $generics_lifetime_bound:lifetime)?
                $(= $generics_default:ty)?
            ),* $(,)?
        >)?

        ($inner:ty => $output:ty)

        $(where
            $( $where_clause_ty:ty
                $(: $where_clause_bound:path)?
                $(: ?$where_clause_unsized_bound:path)?
                $(: $where_clause_lifetime_bound:lifetime)?
            ),* $(,)?
        )?

        ;

        $(#[$wait_meta:meta])*
        $wait_vis: vis wait();
    ) => { ... };
}
Expand description

A wrapper around an EventListenerFuture that can be easily exported for use.

This type implements Future, has a _new() constructor, and a wait() method that uses the Blocking strategy to poll the future until it is ready.

Examples

mod my_future {
    use event_listener_strategy::{easy_wrapper, EventListenerFuture, Strategy};
    use std::pin::Pin;
    use std::task::Poll;

    struct MyFuture;

    impl EventListenerFuture for MyFuture {
        type Output = ();

        fn poll_with_strategy<'a, S: Strategy<'a>>(
            self: Pin<&mut Self>,
            strategy: &mut S,
            context: &mut S::Context,
        ) -> Poll<Self::Output> {
            /* ... */
        }
    }

    easy_wrapper! {
        /// A future that does something.
        pub struct MyFutureWrapper(MyFuture => ());
        /// Wait for it.
        pub wait();
    }

    impl MyFutureWrapper {
        /// Create a new instance of the future.
        pub fn new() -> Self {
            Self::_new(MyFuture)
        }
    }
}

use my_future::MyFutureWrapper;

// Use the future in a blocking context.
let future = MyFutureWrapper::new();
future.wait();

// Use the future in a non-blocking context.
futures_lite::future::block_on(async {
    let future = MyFutureWrapper::new();
    future.await;
});