use std::{cell::UnsafeCell, mem::MaybeUninit, ops::Deref, sync::Once};
use gw2api_rs::{blocking, Builder};
pub static CLIENT: Client = Client::dangling();
pub struct Client {
once: Once,
inner: UnsafeCell<MaybeUninit<blocking::Client>>,
}
impl Client {
const fn dangling() -> Self {
Self {
once: Once::new(),
inner: UnsafeCell::new(MaybeUninit::uninit()),
}
}
}
impl Deref for Client {
type Target = blocking::Client;
fn deref(&self) -> &Self::Target {
self.once.call_once(|| {
let inner = unsafe { &mut *self.inner.get() };
let mut builder = Builder::new();
if let Ok(access_token) = std::env::var("APIKEY") {
builder = builder.access_token(access_token);
}
inner.write(builder.into());
});
unsafe { (&*self.inner.get()).assume_init_ref() }
}
}
unsafe impl Sync for Client {}