use serde::{Deserialize, Serialize};
use super::LichessGlicko;
use crate::model::LichessLightUser;
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct LichessPerfStatPerf {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub glicko: Option<LichessGlicko>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub nb: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub progress: Option<i32>,
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct LichessPerfStatRatingAt {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub int: Option<i32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub at: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub game_id: Option<String>,
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct LichessPerfStatResult {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub op_rating: Option<i32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub op_id: Option<LichessLightUser>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub at: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub game_id: Option<String>,
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct LichessPerfStatResults {
#[serde(default)]
pub results: Vec<LichessPerfStatResult>,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct LichessPerfStatCount {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub all: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub rated: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub win: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub loss: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub draw: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tour: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub berserk: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub op_avg: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub seconds: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub disconnects: Option<u32>,
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct LichessPerfStatStreakStamp {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub at: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub game_id: Option<String>,
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct LichessPerfStatStreakSpan {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub v: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub from: Option<LichessPerfStatStreakStamp>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub to: Option<LichessPerfStatStreakStamp>,
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct LichessPerfStatStreak {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub cur: Option<LichessPerfStatStreakSpan>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max: Option<LichessPerfStatStreakSpan>,
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct LichessPerfStatResultStreak {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub win: Option<LichessPerfStatStreak>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub loss: Option<LichessPerfStatStreak>,
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct LichessPerfStatPlayStreak {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub nb: Option<LichessPerfStatStreak>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub time: Option<LichessPerfStatStreak>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub last_date: Option<String>,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct LichessPerfStatDetails {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub highest: Option<LichessPerfStatRatingAt>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub lowest: Option<LichessPerfStatRatingAt>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub best_wins: Option<LichessPerfStatResults>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub worst_losses: Option<LichessPerfStatResults>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub count: Option<LichessPerfStatCount>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub result_streak: Option<LichessPerfStatResultStreak>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub play_streak: Option<LichessPerfStatPlayStreak>,
}
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct LichessPerfStat {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub percentile: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub rank: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub user: Option<LichessLightUser>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub perf: Option<LichessPerfStatPerf>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub stat: Option<LichessPerfStatDetails>,
}