1use crate::model::{PerfType, Request, Title};
2use serde::{Deserialize, Serialize};
3
4#[derive(Clone, Debug, Deserialize, Serialize)]
5pub struct PerfTypeData {
6 pub key: String,
7 pub name: String,
8}
9
10#[derive(Clone, Debug, Deserialize, Serialize)]
11pub struct User {
12 pub name: String,
13}
14
15#[derive(Clone, Debug, Deserialize, Serialize)]
16pub struct Glicko {
17 pub rating: f64,
18 pub deviation: f64,
19
20 #[serde(skip_serializing_if = "Option::is_none")]
21 pub provisional: Option<bool>,
22}
23
24#[derive(Clone, Debug, Deserialize, Serialize)]
25pub struct Perf {
26 pub glicko: Glicko,
27
28 #[serde(rename = "nb")]
29 pub rated_games: u32,
30 pub progress: i32,
31}
32
33#[derive(Clone, Debug, Deserialize, Serialize)]
34#[serde(rename_all = "camelCase")]
35pub struct Game {
36 pub at: String,
37 pub game_id: String,
38}
39
40#[derive(Clone, Debug, Deserialize, Serialize)]
41#[serde(rename_all = "camelCase")]
42pub struct RatingExtreme {
43 #[serde(rename = "int")]
44 pub rating: u32,
45
46 #[serde(flatten)]
47 pub game: Game,
48}
49
50#[derive(Clone, Debug, Deserialize, Serialize)]
51pub struct UserId {
52 pub id: String,
53 pub name: String,
54 pub title: Option<Title>,
55}
56
57#[derive(Clone, Debug, Deserialize, Serialize)]
58#[serde(rename_all = "camelCase")]
59pub struct WinExtremeGame {
60 #[serde(rename = "opRating")]
61 pub opponent_rating: u32,
62
63 #[serde(rename = "opId")]
64 pub opponent: UserId,
65
66 #[serde(flatten)]
67 pub game: Game,
68}
69
70#[derive(Clone, Debug, Deserialize, Serialize)]
71#[serde(rename_all = "camelCase")]
72pub struct WinExtremes {
73 pub results: Vec<WinExtremeGame>,
74}
75
76#[derive(Clone, Debug, Deserialize, Serialize)]
77#[serde(rename_all = "camelCase")]
78pub struct Count {
79 pub all: u32,
80 pub rated: u32,
81 pub win: u32,
82 pub loss: u32,
83 pub draw: u32,
84 pub tour: u32,
85 pub berserk: u32,
86 pub op_avg: f64,
87 pub seconds: u32,
88 pub disconnects: u32,
89}
90
91#[derive(Clone, Debug, Deserialize, Serialize)]
92#[serde(rename_all = "camelCase", untagged)]
93pub enum Streak {
94 Range { v: u32, from: Game, to: Game },
95 Empty { v: u32 },
96}
97
98#[derive(Clone, Debug, Deserialize, Serialize)]
99pub struct StreakSet {
100 #[serde(rename = "cur")]
101 pub current: Streak,
102 pub max: Streak,
103}
104
105#[derive(Clone, Debug, Deserialize, Serialize)]
106pub struct ResultStreak {
107 pub win: StreakSet,
108 pub loss: StreakSet,
109}
110
111#[derive(Clone, Debug, Deserialize, Serialize)]
112#[serde(rename_all = "camelCase")]
113pub struct PlayStreak {
114 #[serde(rename = "nb")]
115 pub game_count: StreakSet,
116 pub time: StreakSet,
117 pub last_date: String,
118}
119
120#[derive(Clone, Debug, Deserialize, Serialize)]
121#[serde(rename_all = "camelCase")]
122pub struct Stat {
123 pub perf_type: PerfTypeData,
124 pub id: String,
125 pub highest: RatingExtreme,
126 pub lowest: RatingExtreme,
127 pub best_wins: WinExtremes,
128 pub worst_losses: WinExtremes,
129 pub count: Count,
130 pub result_streak: ResultStreak,
131 pub play_streak: PlayStreak,
132 pub user_id: UserId,
133}
134
135#[derive(Clone, Debug, Deserialize, Serialize)]
136#[serde(rename_all = "camelCase")]
137pub struct PerfStat {
138 pub user: User,
139 pub perf: Perf,
140 pub rank: Option<u32>,
141 pub percentile: Option<f64>,
142 pub stat: Stat,
143}
144
145#[derive(Default, Clone, Debug, Serialize)]
146pub struct GetQuery;
147
148pub type GetRequest = Request<GetQuery>;
149
150impl GetRequest {
151 pub fn new(username: &str, perf: PerfType) -> Self {
152 Self::get(format!("/api/user/{username}/perf/{perf}"), None, None)
153 }
154}