use std::future::Future; /// Runs an async function to completion by creating a Tokio runtime /// and blocking on the future within it. /// /// # Example /// /// ``` /// use tokio_wrapper::tokio_run; /// /// let result = tokio_run(async { /// // your async code here /// 42 /// }); /// println!("Result: {}", result); /// ``` pub fn tokio_run(future: F) -> T where F: Future, { // Create a new Tokio runtime and block on the future let rt = tokio::runtime::Runtime::new().expect("Failed to create Tokio runtime"); rt.block_on(future) } /// A macro that wraps an async expression with `tokio_run`. /// /// Equivalent to: /// ```ignore /// tokio_run(async move { ... }) /// ``` /// /// # Example /// /// ``` /// use tokio_wrapper::tkr; /// /// // Instead of: /// // tokio_run(async move { some_async_fn().await }) /// // Use: /// let result = tkr! { some_async_fn().await }; /// ``` #[macro_export] macro_rules! tkr { ($($expr:tt)*) => { $crate::tokio_wrapper::tokio_run(async move { $($expr)* }) }; }