use crate::client::Client;
use crate::error::ApiError;
use crate::utils::ids_to_string;
const ENDPOINT_URL: &str = "/v2/pvp/ranks";
#[derive(Debug, Deserialize, PartialEq)]
pub struct Rank {
id: u32,
finisher_id: u32,
name: String,
#[serde(rename = "icon")]
icon_url: String,
min_rank: u32,
max_rank: u32,
levels: Vec<Levels>,
}
#[derive(Debug, Deserialize, PartialEq)]
pub struct Levels {
min_rank: u32,
max_rank: u32,
points: u32,
}
impl Rank {
pub fn get_all_ids(client: &Client) -> Result<u32, ApiError> {
client.request(ENDPOINT_URL)
}
pub fn get_id(client: &Client, id: u32) -> Result<Rank, ApiError> {
let url = format!("{}?ids={}", ENDPOINT_URL, id);
client.request(&url)
}
pub fn get_all_ranks(client: &Client) -> Result<Vec<Rank>, ApiError> {
let url = format!("{}?ids=all", ENDPOINT_URL);
client.request(&url)
}
pub fn get_ranks_by_ids(client: &Client, ids: Vec<String>) -> Result<Vec<Rank>, ApiError> {
let url = format!("{}?ids={}", ENDPOINT_URL, ids_to_string(ids));
client.request(&url)
}
pub fn id(&self) -> u32 {
self.id
}
pub fn name(&self) -> &str {
&self.name
}
pub fn icon_url(&self) -> &str {
&self.icon_url
}
pub fn min_rank(&self) -> u32 {
self.min_rank
}
pub fn max_rank(&self) -> u32 {
self.max_rank
}
pub fn levels(&self) -> &Vec<Levels> {
&self.levels
}
}
#[cfg(test)]
mod tests {
use crate::v2::pvp::ranks::Rank;
#[test]
fn create_rank() {
let json_rank = r#"
{
"id": 2,
"finisher_id": 2,
"name": "Deer",
"icon": "https://render.guildwars2.com/file/DECD0D647C9433CC2128BF2F6FE5A5185513EE59/347223.png",
"min_rank": 10,
"max_rank": 19,
"levels": [
{
"min_rank": 10,
"max_rank": 19,
"points": 4000
}
]
}"#;
match serde_json::from_str::<Rank>(json_rank) {
Ok(_) => assert!(true),
Err(e) => panic!(e.to_string()),
}
}
}