#[cfg(feature = "ratelimiting")]
use crate::http::{Ratelimit, RatelimitBuilder};
use crate::internals::Rc;
use crate::leaderboard::Client as LeaderboardClient;
use crate::stats::Client as StatsClient;
use crate::{Error, Http};
#[derive(Clone, Debug)]
pub struct Client {
http: Rc<Http>,
stats: StatsClient,
leaderboard: LeaderboardClient,
}
impl Client {
fn _new(
token: &str,
#[cfg(feature = "ratelimiting")] ratelimit: Ratelimit,
) -> Result<Self, Error> {
let http = Rc::new(Http::new(
token,
#[cfg(feature = "ratelimiting")]
ratelimit,
)?);
let stats = StatsClient::new(http.clone());
let leaderboard = LeaderboardClient::new(http.clone());
let s = Self {
stats,
leaderboard,
http,
};
Ok(s)
}
pub fn new(token: impl AsRef<str>) -> Result<Self, Error> {
Self::_new(
token.as_ref(),
#[cfg(feature = "ratelimiting")]
Ratelimit::default(),
)
}
#[cfg(feature = "ratelimiting")]
pub fn with_ratelimit<F>(token: impl AsRef<str>, op: F) -> Result<Self, Error>
where
F: FnOnce(RatelimitBuilder) -> RatelimitBuilder,
{
let builder = op(RatelimitBuilder::new());
let ratelimit = builder.build();
Self::_new(token.as_ref(), ratelimit)
}
pub fn stats(&self) -> &StatsClient {
&self.stats
}
pub fn leaderboard(&self) -> &LeaderboardClient {
&self.leaderboard
}
#[cfg(feature = "ratelimiting")]
pub async fn ratelimit(&self) -> Ratelimit {
self.http.ratelimit().await
}
}