use cfg_if::*; use core::future::Future; cfg_if! { if #[cfg(feature="rt-async-std")] { pub use async_std::task::JoinHandle; pub use async_std::net::TcpListener; //pub use async_std::net::TcpStream; //pub use async_std::future::TimeoutError; pub fn spawn + Send + 'static, T: Send + 'static>(f: F) -> JoinHandle { async_std::task::spawn_local(f) } pub fn spawn_local + 'static, T: 'static>(f: F) -> JoinHandle { async_std::task::spawn_local(f) } pub fn spawn_detached_local + 'static, T: 'static>(f: F) { let _ = async_std::task::spawn_local(f); } pub use async_std::task::sleep; pub use async_std::future::timeout; pub fn block_on, T>(f: F) -> T { async_std::task::block_on(f) } } else if #[cfg(feature="rt-tokio")] { pub use tokio::task::JoinHandle; pub use tokio::net::TcpListener; //pub use tokio::net::TcpStream; //pub use tokio_util::compat::*; pub use tokio::time::error::Elapsed as TimeoutError; pub fn spawn + Send + 'static, T: Send + 'static>(f: F) -> JoinHandle { tokio::task::spawn(f) } pub fn spawn_local + 'static, T: 'static>(f: F) -> JoinHandle { tokio::task::spawn_local(f) } pub fn spawn_detached_local + 'static, T: 'static>(f: F) { let _ = tokio::task::spawn_local(f); } pub use tokio::time::sleep; pub use tokio::time::timeout; pub fn block_on, T>(f: F) -> T { let rt = tokio::runtime::Runtime::new().unwrap(); let local = tokio::task::LocalSet::new(); local.block_on(&rt, f) } } }