re_datafusion/
wasm_compat.rsuse datafusion::common::DataFusionError;
#[cfg(not(target_arch = "wasm32"))]
#[inline]
pub async fn make_future_send<F, T>(f: F) -> Result<T, DataFusionError>
where
F: std::future::Future<Output = Result<T, DataFusionError>> + Send + 'static,
T: Send + 'static,
{
f.await
}
#[cfg(target_arch = "wasm32")]
pub fn make_future_send<F, T>(
f: F,
) -> impl std::future::Future<Output = Result<T, DataFusionError>> + Send + 'static
where
F: std::future::Future<Output = Result<T, DataFusionError>> + 'static,
T: Send + 'static,
{
use futures::{pin_mut, FutureExt as _};
use futures_util::future::{select, Either};
let (mut tx, rx) = futures::channel::oneshot::channel();
wasm_bindgen_futures::spawn_local(async {
let cancellation = tx.cancellation();
pin_mut!(f, cancellation);
match select(f, cancellation).await {
Either::Left((result, _)) => {
let _ = tx.send(result);
}
Either::Right(_) => {
}
}
});
rx.map(|result| result.unwrap_or_else(|err| Err(DataFusionError::External(err.into()))))
}