use crate::errors::SteamError;
use reqwest::blocking::Client;
use reqwest::StatusCode;
use serde::Serialize;
use serde_json::Value;
pub trait ApiClient {
fn get_request<T: Serialize>(
&self,
endpoint: &str,
query: Vec<(&str, T)>,
) -> Result<Value, SteamError>;
}
pub struct SteamClient {
client: Client,
api_key: String,
}
impl ApiClient for SteamClient {
fn get_request<T: Serialize>(
&self,
endpoint: &str,
query: Vec<(&str, T)>,
) -> Result<Value, SteamError> {
let response = self
.client
.get(endpoint)
.query(&[("key", self.api_key.clone())])
.query(&query)
.send();
match response {
Ok(r) => match r.status() {
StatusCode::OK => Ok(r.json().unwrap()), StatusCode::UNAUTHORIZED => {
Err(SteamError::FailedRequest("Unauthorized. Either you have used an invalid API key, or the data you wanted to access is private".to_string()))
}
_ => Err(SteamError::FailedRequest(
"Steam could not process your request. Double-check your provided parameters (Steam ID, app ID, ...).".to_string(),
)),
},
Err(_) => Err(SteamError::FailedRequest(
"Something went wrong with your request".to_string(),
)),
}
}
}
impl SteamClient {
pub fn new(api_key: String) -> Self {
let client = reqwest::blocking::Client::new();
SteamClient { client, api_key }
}
}