use super::{Osu, OsuRef};
use crate::{ratelimit::RateLimiter, OsuError, OsuResult};
#[cfg(feature = "metrics")]
use crate::metrics::Metrics;
use reqwest::ClientBuilder as ReqwestClientBuilder;
use std::{sync::Arc, time::Duration};
#[derive(Debug)]
pub struct OsuBuilder {
reqwest_client: Option<ReqwestClientBuilder>,
timeout: Duration,
api_key: Box<str>,
}
impl OsuBuilder {
pub fn new(api_key: impl Into<Box<str>>) -> Self {
Self {
timeout: Duration::from_secs(10),
reqwest_client: None,
api_key: api_key.into(),
}
}
pub fn build(self) -> OsuResult<Osu> {
let http = self
.reqwest_client
.unwrap_or_else(ReqwestClientBuilder::new)
.timeout(self.timeout)
.build()
.map_err(OsuError::BuildingClient)?;
let inner = OsuRef {
http,
api_key: self.api_key,
ratelimiter: RateLimiter::new(15, 1),
#[cfg(feature = "metrics")]
metrics: Metrics::new(),
};
Ok(Osu(Arc::new(inner)))
}
pub fn reqwest_client(mut self, client: ReqwestClientBuilder) -> Self {
self.reqwest_client.replace(client);
self
}
pub fn timeout(mut self, duration: Duration) -> Self {
self.timeout = duration;
self
}
}