lichess_api/model/users/
performance.rs

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}