use std::time::Duration;
use crate::cache::ApiCache;
use crate::client::{AuthState, Client};
use crate::error::{ApiErrorResponse, Error, Result};
use crate::internal::BASE_URL;
use crate::models::Riven;
use super::ApiResponse;
impl<S: AuthState> Client<S> {
pub async fn fetch_rivens(&self) -> Result<Vec<Riven>> {
self.wait_for_rate_limit().await;
let response = self
.http
.get(format!("{}/riven/weapons", BASE_URL))
.send()
.await
.map_err(Error::Network)?;
let status = response.status();
if !status.is_success() {
let body = response.text().await.unwrap_or_default();
if let Ok(error_response) = serde_json::from_str::<ApiErrorResponse>(&body) {
return Err(Error::api_with_response(
status,
"Failed to fetch rivens",
error_response,
));
}
return Err(Error::api(
status,
format!("Failed to fetch rivens: {}", body),
));
}
let body = response.text().await.map_err(Error::Network)?;
let api_response: ApiResponse<Vec<Riven>> =
serde_json::from_str(&body).map_err(|e| Error::parse_with_body(e.to_string(), body))?;
Ok(api_response.data)
}
pub async fn get_rivens(&self, cache: Option<&mut ApiCache>) -> Result<Vec<Riven>> {
match cache {
Some(c) => {
if let Some(rivens) = c.get_rivens() {
return Ok(rivens.to_vec());
}
let rivens = self.fetch_rivens().await?;
c.set_rivens(rivens.clone());
Ok(rivens)
}
None => self.fetch_rivens().await,
}
}
pub async fn get_rivens_with_ttl(
&self,
cache: Option<&mut ApiCache>,
max_age: Duration,
) -> Result<Vec<Riven>> {
if let Some(c) = cache {
c.invalidate_rivens_if_older_than(max_age);
self.get_rivens(Some(c)).await
} else {
self.fetch_rivens().await
}
}
}