use serde::{self, Serialize, Deserialize};
use std::ops::{Deref, DerefMut};
use crate::util::fetch_route;
use crate::error::Result;
#[cfg(feature = "async")]
use crate::util::a_fetch_route;
#[cfg(feature = "async")]
use crate::http::Client;
use crate::http::routes::Route;
use super::players::PlayerRanking;
#[derive(Debug, Clone, Hash, PartialEq, Eq, Serialize, Deserialize)]
pub struct BrawlerLeaderboard {
#[serde(default)]
pub items: Vec<PlayerRanking>,
}
impl Deref for BrawlerLeaderboard {
type Target = Vec<PlayerRanking>;
fn deref(&self) -> &Vec<PlayerRanking> {
&self.items
}
}
impl DerefMut for BrawlerLeaderboard {
fn deref_mut(&mut self) -> &mut Vec<PlayerRanking> {
&mut self.items
}
}
impl BrawlerLeaderboard {
pub fn fetch(
client: &Client, country_code: &str, brawler_id: usize, limit: u8,
) -> Result<BrawlerLeaderboard> {
let route = Route::BrawlerRankings {
country_code: country_code.to_owned(),
brawler_id,
limit
};
fetch_route::<BrawlerLeaderboard>(client, &route)
}
#[cfg(feature="async")]
pub async fn a_fetch(
client: &Client, country_code: &str, brawler_id: usize, limit: u8,
) -> Result<BrawlerLeaderboard> {
let route = Route::BrawlerRankings {
country_code: country_code.to_owned(),
brawler_id,
limit
};
a_fetch_route::<BrawlerLeaderboard>(client, &route).await
}
}
#[cfg(test)]
mod tests {
use serde_json;
use super::BrawlerLeaderboard;
use super::super::players::{PlayerRanking, PlayerRankingClub};
use crate::error::Error;
#[test]
fn rankings_brawlers_deser() -> Result<(), Box<dyn ::std::error::Error>> {
let rb_json_s = r##"{
"items": [
{
"tag": "#AAAAAAAAA",
"name": "Player",
"nameColor": "0xfff05637",
"trophies": 30000,
"rank": 1,
"club": {
"name": "Scary Club"
}
},
{
"tag": "#EEEEEEE",
"name": "Also Player",
"nameColor": "0xffa2e3fe",
"trophies": 25000,
"rank": 2,
"club": {
"name": "Another Club"
}
},
{
"tag": "#QQQQQQQ",
"name": "Youtuber",
"nameColor": "0xfff05637",
"trophies": 23000,
"rank": 3,
"club": {
"name": "Different Club"
}
},
{
"tag": "#55555553Q",
"name": "Not a valid player",
"nameColor": "0xfff9cf08",
"trophies": 20000,
"rank": 4,
"club": {
"name": "Different Club"
}
}
],
"paging": {
"cursors": {}
}
}"##;
let b_leaders = serde_json::from_str::<BrawlerLeaderboard>(rb_json_s)
.map_err(Error::Json)?;
assert_eq!(
b_leaders,
BrawlerLeaderboard {
items: vec![
PlayerRanking {
tag: String::from("#AAAAAAAAA"),
name: String::from("Player"),
name_color: 0xfff05637,
trophies: 30000,
rank: 1,
club: PlayerRankingClub {
name: String::from("Scary Club")
}
},
PlayerRanking {
tag: String::from("#EEEEEEE"),
name: String::from("Also Player"),
name_color: 0xffa2e3fe,
trophies: 25000,
rank: 2,
club: PlayerRankingClub {
name: String::from("Another Club")
}
},
PlayerRanking {
tag: String::from("#QQQQQQQ"),
name: String::from("Youtuber"),
name_color: 0xfff05637,
trophies: 23000,
rank: 3,
club: PlayerRankingClub {
name: String::from("Different Club")
}
},
PlayerRanking {
tag: String::from("#55555553Q"),
name: String::from("Not a valid player"),
name_color: 0xfff9cf08,
trophies: 20000,
rank: 4,
club: PlayerRankingClub {
name: String::from("Different Club")
}
}
]
}
);
Ok(())
}
}