goods 0.5.3

Asset manager for good assets
Documentation
use maybe_sync::BoxFuture;

pub struct SpawnError;

pub trait Spawn: core::fmt::Debug {
    fn spawn(&self, future: BoxFuture<'static, ()>) -> Result<(), SpawnError>;
}

#[cfg(all(feature = "futures-spawn", feature = "sync"))]
impl<S> Spawn for S
where
    S: futures_task::Spawn + core::fmt::Debug,
{
    fn spawn(&self, future: BoxFuture<'static, ()>) -> Result<(), SpawnError> {
        <&S as futures_util::task::SpawnExt>::spawn(&self, future).map_err(|_| SpawnError)
    }
}

#[cfg(all(feature = "futures-spawn", not(feature = "sync")))]
impl<S> Spawn for S
where
    S: futures_task::LocalSpawn + core::fmt::Debug,
{
    fn spawn(&self, future: BoxFuture<'static, ()>) -> Result<(), SpawnError> {
        <&S as futures_util::task::LocalSpawnExt>::spawn_local(&self, future)
            .map_err(|_| SpawnError)
    }
}

#[cfg(feature = "tokio-spawn")]
#[derive(Clone, Debug)]
#[cfg_attr(all(doc, feature = "unstable-doc"), doc(cfg(feature = "tokio-spawn")))]
pub struct Tokio(pub tokio::runtime::Handle);

#[cfg(feature = "tokio-spawn")]
impl Tokio {
    pub fn current() -> Self {
        Tokio(tokio::runtime::Handle::current())
    }
}

#[cfg(feature = "tokio-spawn")]
impl Spawn for Tokio {
    fn spawn(&self, future: BoxFuture<'static, ()>) -> Result<(), SpawnError> {
        self.0.spawn(future);
        Ok(())
    }
}

#[cfg(all(feature = "wasm-bindgen-spawn", target_arch = "wasm32"))]
#[derive(Clone, Copy, Debug, Default)]
#[cfg_attr(
    all(doc, feature = "unstable-doc"),
    doc(all(feature = "wasm-bindgen-spawn", target_arch = "wasm32"))
)]
pub struct WasmBindgen;

#[cfg(all(feature = "wasm-bindgen-spawn", target_arch = "wasm32"))]
impl Spawn for WasmBindgen {
    fn spawn(&self, future: BoxFuture<'static, ()>) -> Result<(), SpawnError> {
        wasm_bindgen_futures::spawn_local(future);
        Ok(())
    }
}