pub use crate::impls::async_std::create_runtime as create_runtime_impl;
use crate::{compound::CompoundRuntime, BlockOn};
use std::io::Result as IoResult;
#[cfg(feature = "native-tls")]
use crate::impls::native_tls::NativeTlsProvider;
#[cfg(feature = "rustls")]
use crate::impls::rustls::RustlsProvider;
use async_executors::AsyncStd;
#[cfg(all(feature = "native-tls"))]
pub use AsyncStdNativeTlsRuntime as PreferredRuntime;
#[cfg(all(feature = "rustls", not(feature = "native-tls")))]
pub use AsyncStdRustlsRuntime as PreferredRuntime;
#[derive(Clone)]
#[cfg(all(feature = "native-tls"))]
pub struct AsyncStdNativeTlsRuntime {
inner: NativeTlsInner,
}
#[cfg(all(feature = "native-tls"))]
type NativeTlsInner = CompoundRuntime<AsyncStd, AsyncStd, AsyncStd, NativeTlsProvider, AsyncStd>;
#[cfg(all(feature = "native-tls"))]
crate::opaque::implement_opaque_runtime! {
AsyncStdNativeTlsRuntime { inner : NativeTlsInner }
}
#[cfg(feature = "rustls")]
#[derive(Clone)]
pub struct AsyncStdRustlsRuntime {
inner: RustlsInner,
}
#[cfg(feature = "rustls")]
type RustlsInner = CompoundRuntime<AsyncStd, AsyncStd, AsyncStd, RustlsProvider, AsyncStd>;
#[cfg(feature = "rustls")]
crate::opaque::implement_opaque_runtime! {
AsyncStdRustlsRuntime { inner: RustlsInner }
}
#[cfg(all(feature = "native-tls"))]
impl AsyncStdNativeTlsRuntime {
pub fn create() -> IoResult<Self> {
let rt = create_runtime_impl();
Ok(AsyncStdNativeTlsRuntime {
inner: CompoundRuntime::new(rt, rt, rt, NativeTlsProvider::default(), rt),
})
}
pub fn current() -> IoResult<Self> {
Self::create()
}
#[doc(hidden)]
pub fn run_test<P, F, O>(func: P) -> O
where
P: FnOnce(Self) -> F,
F: futures::Future<Output = O>,
{
let runtime = Self::create().expect("Failed to create runtime");
runtime.clone().block_on(func(runtime))
}
}
#[cfg(feature = "rustls")]
impl AsyncStdRustlsRuntime {
pub fn create() -> IoResult<Self> {
let rt = create_runtime_impl();
Ok(AsyncStdRustlsRuntime {
inner: CompoundRuntime::new(rt, rt, rt, RustlsProvider::default(), rt),
})
}
pub fn current() -> IoResult<Self> {
Self::create()
}
#[doc(hidden)]
pub fn run_test<P, F, O>(func: P) -> O
where
P: FnOnce(Self) -> F,
F: futures::Future<Output = O>,
{
let runtime = Self::create().expect("Failed to create runtime");
runtime.clone().block_on(func(runtime))
}
}
#[cfg(test)]
mod test {
#![allow(clippy::unwrap_used)]
use super::*;
#[test]
fn current() {
let runtime = PreferredRuntime::create().unwrap();
runtime.block_on(async {
#[cfg(feature = "native-tls")]
assert!(AsyncStdNativeTlsRuntime::current().is_ok());
#[cfg(feature = "rustls")]
assert!(AsyncStdRustlsRuntime::current().is_ok());
});
}
#[test]
fn debug() {
#[cfg(feature = "native-tls")]
assert_eq!(
format!("{:?}", AsyncStdNativeTlsRuntime::create().unwrap()),
"AsyncStdNativeTlsRuntime { .. }"
);
#[cfg(feature = "rustls")]
assert_eq!(
format!("{:?}", AsyncStdRustlsRuntime::create().unwrap()),
"AsyncStdRustlsRuntime { .. }"
);
}
}