battlebit_api/endpoints/leaderboard/
mod.rs

1use derive_getters::Getters;
2use serde::{Deserialize, Serialize};
3
4fn de_usize<'de, D: serde::Deserializer<'de>>(deserializer: D) -> Result<usize, D::Error> {
5    Ok(match serde_json::Value::deserialize(deserializer)? {
6        serde_json::Value::String(s) => s.parse().map_err(serde::de::Error::custom)?,
7        serde_json::Value::Number(num) => num.as_u64().ok_or(serde::de::Error::custom("Invalid number"))? as usize,
8        _ => return Err(serde::de::Error::custom("wrong type"))
9    })
10}
11
12#[allow(dead_code)]
13#[derive(Deserialize, Serialize, Clone, Debug, Getters, PartialEq)]
14#[serde(rename_all(deserialize = "PascalCase"))]
15#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
16/// Data of a single Clan
17pub struct Clan {
18    #[serde(rename(deserialize = "Clan", serialize = "name"))]
19    #[cfg_attr(feature = "utoipa", schema(example = "Clan"))]
20    /// Name of this clan.
21    name: String,
22
23    #[cfg_attr(feature = "utoipa", schema(example = "CLN"))]
24    /// Tag of this clan.
25    tag: String,
26
27    #[serde(rename(deserialize = "XP"), deserialize_with = "de_usize")]
28    #[cfg_attr(feature = "utoipa", schema(example = 1_000_000))]
29    /// The total experience of this clan.
30    xp: usize,
31    #[serde(deserialize_with = "de_usize")]
32    #[cfg_attr(feature = "utoipa", schema(example = 100))]
33    /// The maximum amount of players in this clan.
34    max_players: usize,
35}
36
37#[allow(dead_code)]
38#[derive(Deserialize, Serialize, Clone, Debug, Getters, PartialEq)]
39#[serde(rename_all(deserialize = "PascalCase"))]
40#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
41/// Data of a single player.
42pub struct Player {
43    #[cfg_attr(feature = "utoipa", schema(example = "Player"))]
44    /// The name of this player.
45    name: String,
46
47    #[serde(deserialize_with = "de_usize")]
48    #[cfg_attr(feature = "utoipa", schema(example = 100))]
49    /// The value, this is different for each leaderboard. On the kills leaderboard, it's the amount of kills. On the XP leaderboard, it's the amount of XP.
50    value: usize,
51}
52
53/// Leaderboard data
54#[allow(dead_code)]
55#[derive(Deserialize, Serialize, Clone, Debug, Getters, PartialEq, Default)]
56#[serde(rename_all(deserialize = "PascalCase"))]
57pub struct Leaderboard {
58    top_clans: Vec<Clan>,
59    most_xp: Vec<Player>,
60    most_heals: Vec<Player>,
61    most_revives: Vec<Player>,
62    most_vehicles_destroyed: Vec<Player>,
63    most_vehicle_repairs: Vec<Player>,
64    most_roadkills: Vec<Player>,
65    longest_kills: Vec<Player>,
66    most_objectives_complete: Vec<Player>,
67    most_kills: Vec<Player>,
68}
69
70impl From<Vec<Leaderboards>> for Leaderboard {
71    fn from(lbs: Vec<Leaderboards>) -> Self {
72        let mut leaderboard = Leaderboard {
73            top_clans: Vec::new(),
74            most_xp: Vec::new(),
75            most_kills: Vec::new(),
76            most_heals: Vec::new(),
77            most_revives: Vec::new(),
78            most_vehicles_destroyed: Vec::new(),
79            most_vehicle_repairs: Vec::new(),
80            most_roadkills: Vec::new(),
81            longest_kills: Vec::new(),
82            most_objectives_complete: Vec::new(),
83        };
84
85        for lb in lbs {
86            match lb {
87                Leaderboards::TopClans(d) => leaderboard.top_clans = d,
88                Leaderboards::MostXP(d) => leaderboard.most_xp = d,
89                Leaderboards::MostKills(d) => leaderboard.most_kills = d,
90                Leaderboards::MostHeals(d) => leaderboard.most_heals = d,
91                Leaderboards::MostRevives(d) => leaderboard.most_revives = d,
92                Leaderboards::MostVehiclesDestroyed(d) => leaderboard.most_vehicles_destroyed = d,
93                Leaderboards::MostVehicleRepairs(d) => leaderboard.most_vehicle_repairs = d,
94                Leaderboards::MostRoadkills(d) => leaderboard.most_roadkills = d,
95                Leaderboards::MostLongestKill(d) => leaderboard.longest_kills = d,
96                Leaderboards::MostObjectivesComplete(d) => leaderboard.most_objectives_complete = d,
97            }
98        }
99
100        leaderboard
101    }
102}
103
104#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
105pub enum Leaderboards {
106    TopClans(Vec<Clan>),
107    MostXP(Vec<Player>),
108    MostKills(Vec<Player>),
109    MostHeals(Vec<Player>),
110    MostRevives(Vec<Player>),
111    MostVehiclesDestroyed(Vec<Player>),
112    MostVehicleRepairs(Vec<Player>),
113    MostRoadkills(Vec<Player>),
114    MostLongestKill(Vec<Player>),
115    MostObjectivesComplete(Vec<Player>),
116}