use std::collections::HashMap;
use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct LichessBroadcastTour {
pub id: String,
pub name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub slug: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub url: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tier: Option<i32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub created_at: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub image: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct LichessBroadcastRoundInfo {
pub id: String,
pub name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub slug: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub url: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub created_at: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub rated: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub ongoing: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub starts_at: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub finished_at: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub finished: Option<bool>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct LichessBroadcast {
pub tour: LichessBroadcastTour,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub group: Option<String>,
#[serde(default)]
pub rounds: Vec<LichessBroadcastRoundInfo>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub default_round_id: Option<String>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn parses_broadcast_with_rounds() {
let json = r#"{"tour":{"id":"abc","name":"World Champ","slug":"wc"},
"rounds":[{"id":"r1","name":"Round 1","slug":"round-1","url":"u",
"createdAt":1,"rated":true,"finished":false}]}"#;
let broadcast: LichessBroadcast = serde_json::from_str(json).unwrap();
assert_eq!(broadcast.tour.name, "World Champ");
assert_eq!(broadcast.rounds[0].id, "r1");
assert_eq!(broadcast.rounds[0].finished, Some(false));
}
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct LichessBroadcastTop {
#[serde(default)]
pub active: Vec<LichessBroadcast>,
#[serde(default)]
pub upcoming: Vec<LichessBroadcast>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub past: Option<Value>,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct LichessBroadcastSearchPage {
pub current_page: u32,
pub max_per_page: u32,
#[serde(default)]
pub current_page_results: Vec<LichessBroadcast>,
#[serde(default)]
pub previous_page: Option<u32>,
#[serde(default)]
pub next_page: Option<u32>,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct LichessBroadcastRoundView {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tour: Option<LichessBroadcastTour>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub round: Option<Value>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub games: Option<Value>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub study: Option<Value>,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct LichessBroadcastPlayerEntry {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(flatten)]
pub other: HashMap<String, Value>,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct LichessBroadcastMyRound {
#[serde(flatten)]
pub data: HashMap<String, Value>,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct LichessBroadcastPushResult {
#[serde(flatten)]
pub data: HashMap<String, Value>,
}