battlebit_api/endpoints/leaderboard/
mod.rs1use 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))]
16pub struct Clan {
18 #[serde(rename(deserialize = "Clan", serialize = "name"))]
19 #[cfg_attr(feature = "utoipa", schema(example = "Clan"))]
20 name: String,
22
23 #[cfg_attr(feature = "utoipa", schema(example = "CLN"))]
24 tag: String,
26
27 #[serde(rename(deserialize = "XP"), deserialize_with = "de_usize")]
28 #[cfg_attr(feature = "utoipa", schema(example = 1_000_000))]
29 xp: usize,
31 #[serde(deserialize_with = "de_usize")]
32 #[cfg_attr(feature = "utoipa", schema(example = 100))]
33 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))]
41pub struct Player {
43 #[cfg_attr(feature = "utoipa", schema(example = "Player"))]
44 name: String,
46
47 #[serde(deserialize_with = "de_usize")]
48 #[cfg_attr(feature = "utoipa", schema(example = 100))]
49 value: usize,
51}
52
53#[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}