#[macro_export]
macro_rules! declare_global_client {
() => {
use $crate::client::config::DefaultCfg;
$crate::declare_global_client!(DefaultCfg);
};
($config:ty) => {
pub struct InitWrapper {
inner: core::cell::UnsafeCell<core::mem::MaybeUninit::<$crate::client::Client::<$config>>>,
}
impl InitWrapper {
#[inline(always)]
#[doc(hidden)]
pub const fn new() -> Self {
Self {
inner: core::cell::UnsafeCell::new(core::mem::MaybeUninit::uninit()),
}
}
}
unsafe impl core::marker::Sync for InitWrapper {}
impl core::ops::Deref for InitWrapper {
type Target = $crate::client::Client::<$config>;
fn deref(&self) -> &Self::Target {
static INIT: std::sync::Once = std::sync::Once::new();
let write_ptr = unsafe {
(*self.inner.get()).as_mut_ptr()
};
INIT.call_once(|| unsafe {
core::ptr::write(write_ptr, $crate::client::Client::<$config>::new())
});
unsafe {
&*(*self.inner.get()).as_ptr()
}
}
}
pub static GLOBAL_CLIENT: InitWrapper = InitWrapper::new();
pub struct Request(pub $crate::client::Request);
impl core::ops::Deref for Request {
type Target = $crate::client::Request;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl core::ops::DerefMut for Request {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.0
}
}
pub trait GlobalRequest {
type Result;
fn global(self) -> Self::Result;
}
impl GlobalRequest for $crate::client::Request {
type Result = Request;
fn global(self) -> Self::Result {
Request(self)
}
}
use $crate::client::RequestResult;
impl Request {
#[inline(always)]
pub fn request(self) -> impl core::future::Future<Output=RequestResult> {
GLOBAL_CLIENT.request(self.0)
}
#[inline(always)]
pub fn send(self) -> impl core::future::Future<Output=Result<RequestResult, $crate::async_timer::Expired<impl core::future::Future<Output=RequestResult>, impl $crate::async_timer::Oneshot>>> {
GLOBAL_CLIENT.send(self.0)
}
#[inline(always)]
pub fn send_redirect(self) -> impl core::future::Future<Output=Result<RequestResult, $crate::async_timer::Expired<impl core::future::Future<Output=RequestResult> + 'static, impl $crate::async_timer::Oneshot>>> {
GLOBAL_CLIENT.send_redirect(self.0)
}
#[inline(always)]
pub fn redirect_request(self) -> impl core::future::Future<Output=RequestResult> {
GLOBAL_CLIENT.redirect_request(self.0)
}
}
};
}
#[cfg(feature = "docs")]
pub mod generated {
declare_global_client!();
}