use crate::types::LevelData as Data;
#[derive(Debug)]
pub struct LevelData{
pub name: String,
categories: bool,
}
#[derive(Debug)]
pub enum LevelError {
LevelNotFound,
InvalidArguments,
ReqwestError(reqwest::Error),
}
#[derive(Debug)]
pub enum LevelResult {
Level(Data),
None,
Error(LevelError),
}
impl LevelResult {
pub fn name(&self) -> &str {
if let LevelResult::Level(level_data) = self {
&level_data.data.name
}
else{
panic!("Cannot get name from: {:?}", self);
}
}
pub fn id(&self) -> &str {
if let LevelResult::Level(level_data) = self {
&level_data.data.id
}
else{
panic!("Cannot get id from: {:?}", self);
}
}
pub fn weblink(&self) -> &str {
if let LevelResult::Level(level_data) = self {
&level_data.data.weblink
}
else{
panic!("Cannot get weblink from: {:?}", self);
}
}
pub fn rules(&self) -> String {
if let LevelResult::Level(level_data) = self {
let rules = &level_data.data.rules;
rules.replace("\r\n\r\n", " ")
}
else{
panic!("Cannot get rules from: {:?}", self);
}
}
pub fn links(&self) -> Vec<(String, String)> {
if let LevelResult::Level(level_data) = self {
let links = &level_data.data.links;
let names: Vec<&str> = links.iter().map(|link| link.rel.as_str()).collect();
let urls: Vec<&str> = links.iter().map(|link| link.uri.as_str()).collect();
let merged_vec: Vec<(String, String)> = names.iter().zip(urls.iter()).map(|(x, y)| (x.to_string(), y.to_string())).collect();
return merged_vec.to_vec();
}
else{
panic!("Cannot get links from: {:?}", self);
}
}
}
impl LevelData{
pub fn new(name: &str) -> LevelData{
LevelData{
name: name.to_string(),
categories: false,
}
}
pub fn categories(mut self) -> Self{
self.categories = true;
self
}
#[tokio::main]
pub async fn run(&self) -> LevelResult {
let client = reqwest::Client::new();
let url = if self.categories{
format!("https://www.speedrun.com/api/v1/levels/{}/categories", self.name)
} else{
format!("https://www.speedrun.com/api/v1/levels/{}", self.name)
};
let response = match client.get(url).send().await{
Ok(response) => response,
Err(err) => return LevelResult::Error(LevelError::ReqwestError(err.into())),
};
if response.status() == reqwest::StatusCode::NOT_FOUND{
return LevelResult::Error(LevelError::LevelNotFound);
}
if self.categories{
println!("test");
LevelResult::None
}
else{
let response = match response.json::<Data>().await{
Ok(response) => response,
Err(err) => return LevelResult::Error(LevelError::ReqwestError(err.into())),
};
LevelResult::Level(response)
}
}
}