use crate::types::GameTypeData as Data;
#[derive(Debug)]
pub struct GameTypeData{
pub gametype: String,
}
#[derive(Debug)]
pub enum GameTypeError {
GameTypeNotFound,
InvalidArguments,
ReqwestError(reqwest::Error),
}
#[derive(Debug)]
pub enum GameTypeResult {
GameType(Data),
None,
Error(GameTypeError),
}
impl GameTypeResult{
pub fn name(&self) -> &str{
if let GameTypeResult::GameType(gametype_data) = self{
&gametype_data.data.name
}
else{
panic!("Cannot Get name from: {:?}", self);
}
}
pub fn id(&self) -> &str{
if let GameTypeResult::GameType(gametype_data) = self{
&gametype_data.data.id
}
else{
panic!("Cannot Get id from: {:?}", self);
}
}
}
impl GameTypeData{
pub fn new(gametype: &str) -> GameTypeData{
GameTypeData{
gametype: gametype.to_string(),
}
}
#[tokio::main]
pub async fn run(&self) -> GameTypeResult{
let client = reqwest::Client::new();
let url = format!("https://www.speedrun.com/api/v1/gametypes/{:1}", self.gametype);
let response = match client.get(url).send().await{
Ok(response) => response,
Err(err) => return GameTypeResult::Error(GameTypeError::ReqwestError(err)),
};
if response.status() == reqwest::StatusCode::NOT_FOUND{
return GameTypeResult::Error(GameTypeError::GameTypeNotFound);
}
let response = match response.json::<Data>().await{
Ok(response) => response,
Err(err) => return GameTypeResult::Error(GameTypeError::ReqwestError(err)),
};
GameTypeResult::GameType(response)
}
}