summaryrefslogtreecommitdiff
path: root/rola-cli/src/tokio_wrapper.rs
diff options
context:
space:
mode:
Diffstat (limited to 'rola-cli/src/tokio_wrapper.rs')
-rw-r--r--rola-cli/src/tokio_wrapper.rs48
1 files changed, 48 insertions, 0 deletions
diff --git a/rola-cli/src/tokio_wrapper.rs b/rola-cli/src/tokio_wrapper.rs
new file mode 100644
index 0000000..8293355
--- /dev/null
+++ b/rola-cli/src/tokio_wrapper.rs
@@ -0,0 +1,48 @@
+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<F, T>(future: F) -> T
+where
+ F: Future<Output = T>,
+{
+ // 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)* })
+ };
+}