use std::future::Future;
pub trait AsyncExecutor {
fn block_on<T>(&self, future: impl Future<Output = T>) -> T;
}
#[cfg(feature = "async_futures")]
pub struct FuturesExecutor;
#[cfg(feature = "async_futures")]
impl AsyncExecutor for FuturesExecutor {
fn block_on<T>(&self, future: impl Future<Output = T>) -> T {
futures::executor::block_on(future)
}
}
#[cfg(feature = "async_smol")]
pub struct SmolExecutor;
#[cfg(feature = "async_smol")]
impl AsyncExecutor for SmolExecutor {
fn block_on<T>(&self, future: impl Future<Output = T>) -> T {
smol::block_on(future)
}
}
#[cfg(feature = "async_tokio")]
impl AsyncExecutor for tokio::runtime::Runtime {
fn block_on<T>(&self, future: impl Future<Output = T>) -> T {
self.block_on(future)
}
}
#[cfg(feature = "async_tokio")]
impl AsyncExecutor for &tokio::runtime::Runtime {
fn block_on<T>(&self, future: impl Future<Output = T>) -> T {
(*self).block_on(future)
}
}
#[cfg(feature = "async_std")]
pub struct AsyncStdExecutor;
#[cfg(feature = "async_std")]
impl AsyncExecutor for AsyncStdExecutor {
fn block_on<T>(&self, future: impl Future<Output = T>) -> T {
async_std::task::block_on(future)
}
}