lichess_api/model/board/stream/
game.rs1use crate::model::{Clock, Room, Speed, Variant};
2use serde::{Deserialize, Serialize};
3use serde_with::skip_serializing_none;
4
5#[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize)]
6#[serde(rename_all = "lowercase")]
7pub enum GameColor {
8 White,
9 Black,
10}
11
12#[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize)]
13#[serde(rename_all = "camelCase")]
14pub enum GameStatusName {
15 Created,
16 Started,
17 Aborted,
18 Mate,
19 Resign,
20 Stalemate,
21 Timeout,
22 Draw,
23 Outoftime,
24 Cheat,
25 NoStart,
26 UnknownFinish,
27 VariantEnd,
28}
29
30#[derive(Default, Clone, Debug, Serialize)]
31pub struct GetQuery;
32
33pub type GetRequest = crate::model::Request<GetQuery>;
34
35impl GetRequest {
36 pub fn new(game_id: &str) -> Self {
37 Self::get(format!("/api/board/game/stream/{game_id}"), None, None)
38 }
39}
40
41impl<S: AsRef<str>> From<S> for GetRequest {
42 fn from(s: S) -> Self {
43 Self::new(s.as_ref())
44 }
45}
46
47#[skip_serializing_none]
48#[derive(Clone, Debug, Deserialize, Serialize)]
49#[serde(tag = "type")]
50#[serde(rename_all = "camelCase")]
51pub enum Event {
52 GameFull {
53 #[serde(flatten)]
54 game_full: GameFullEvent,
55 },
56 GameState {
57 #[serde(flatten)]
58 game_state: GameStateEvent,
59 },
60 ChatLine {
61 #[serde(flatten)]
62 chat_line: ChatLineEvent,
63 },
64 OpponentGone {
65 #[serde(flatten)]
66 opponent_gone: OpponentGoneEvent,
67 },
68}
69
70#[skip_serializing_none]
71#[derive(Clone, Debug, Deserialize, Serialize)]
72#[serde(rename_all = "camelCase")]
73pub struct GameFullEvent {
74 pub id: String,
75 pub variant: Variant,
76 pub rated: bool,
77 pub clock: Option<Clock>,
78 pub speed: Speed,
79 pub perf: Perf,
80 pub created_at: u64,
81 pub white: GameEventPlayer,
82 pub black: GameEventPlayer,
83 pub initial_fen: Option<String>,
84 pub state: Option<GameStateEvent>,
85 pub tournament_id: Option<String>,
86}
87
88#[skip_serializing_none]
89#[derive(Clone, Debug, Deserialize, Serialize)]
90#[serde(rename_all = "camelCase")]
91pub struct GameStateEvent {
92 pub r#type: Option<String>,
94 pub moves: String,
95 pub wtime: u64,
96 pub btime: u64,
97 pub winc: u64,
98 pub binc: u64,
99 pub status: GameStatusName,
100 pub winner: Option<GameColor>,
101 pub wdraw: Option<bool>,
102 pub bdraw: Option<bool>,
103 pub wtakeback: Option<bool>,
104 pub btakeback: Option<bool>,
105}
106
107#[skip_serializing_none]
108#[derive(Clone, Debug, Deserialize, Serialize)]
109#[serde(rename_all = "camelCase")]
110pub struct ChatLineEvent {
111 pub room: Room,
112 pub username: String,
113 pub text: String,
114}
115
116#[skip_serializing_none]
117#[derive(Clone, Debug, Deserialize, Serialize)]
118#[serde(rename_all = "camelCase")]
119pub struct OpponentGoneEvent {
120 pub gone: bool,
121 pub claim_win_in_seconds: Option<u32>,
122}
123
124#[derive(Clone, Debug, Deserialize, Serialize)]
125#[serde(rename_all = "camelCase")]
126pub struct GameEventPlayer {
127 pub id: String,
128 pub name: String,
129 #[serde(skip_serializing_if = "Option::is_none")]
130 pub ai_level: Option<u32>,
131 #[serde(skip_serializing_if = "Option::is_none")]
132 pub title: Option<String>,
133 #[serde(skip_serializing_if = "Option::is_none")]
134 pub rating: Option<u32>,
135 #[serde(skip_serializing_if = "Option::is_none")]
136 pub provisional: Option<bool>,
137}
138
139#[derive(Clone, Debug, Serialize, Deserialize)]
140pub struct Perf {
141 pub name: String,
142}