lichess-api 1.0.0

A client library for the Lichess API
Documentation
use crate::model::{PerfType, Request, Title};
use serde::{Deserialize, Serialize};

#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct PerfTypeData {
    pub key: String,
    pub name: String,
}

#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct User {
    pub name: String,
}

#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct Glicko {
    pub rating: f64,
    pub deviation: f64,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub provisional: Option<bool>,
}

#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct Perf {
    pub glicko: Glicko,

    #[serde(rename = "nb")]
    pub rated_games: u32,
    pub progress: i32,
}

#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct Game {
    pub at: String,
    pub game_id: String,
}

#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct RatingExtreme {
    #[serde(rename = "int")]
    pub rating: u32,

    #[serde(flatten)]
    pub game: Game,
}

#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct UserId {
    pub id: String,
    pub name: String,
    pub title: Option<Title>,
}

#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct WinExtremeGame {
    #[serde(rename = "opRating")]
    pub opponent_rating: u32,

    #[serde(rename = "opId")]
    pub opponent: UserId,

    #[serde(flatten)]
    pub game: Game,
}

#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct WinExtremes {
    pub results: Vec<WinExtremeGame>,
}

#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct Count {
    pub all: u32,
    pub rated: u32,
    pub win: u32,
    pub loss: u32,
    pub draw: u32,
    pub tour: u32,
    pub berserk: u32,
    pub op_avg: f64,
    pub seconds: u32,
    pub disconnects: u32,
}

#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename_all = "camelCase", untagged)]
pub enum Streak {
    Range { v: u32, from: Game, to: Game },
    Empty { v: u32 },
}

#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct StreakSet {
    #[serde(rename = "cur")]
    pub current: Streak,
    pub max: Streak,
}

#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct ResultStreak {
    pub win: StreakSet,
    pub loss: StreakSet,
}

#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct PlayStreak {
    #[serde(rename = "nb")]
    pub game_count: StreakSet,
    pub time: StreakSet,
    pub last_date: String,
}

#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct Stat {
    pub perf_type: PerfTypeData,
    pub id: String,
    pub highest: RatingExtreme,
    pub lowest: RatingExtreme,
    pub best_wins: WinExtremes,
    pub worst_losses: WinExtremes,
    pub count: Count,
    pub result_streak: ResultStreak,
    pub play_streak: PlayStreak,
    pub user_id: UserId,
}

#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct PerfStat {
    pub user: User,
    pub perf: Perf,
    pub rank: Option<u32>,
    pub percentile: Option<f64>,
    pub stat: Stat,
}

#[derive(Default, Clone, Debug, Serialize)]
pub struct GetQuery;

pub type GetRequest = Request<GetQuery>;

impl GetRequest {
    pub fn new(username: &str, perf: PerfType) -> Self {
        Self::get(format!("/api/user/{username}/perf/{perf}"), None, None)
    }
}