use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum LichessColor {
#[default]
White,
Black,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub enum LichessSpeed {
UltraBullet,
Bullet,
Blitz,
Rapid,
Classical,
Correspondence,
}
impl LichessSpeed {
#[must_use]
pub fn as_str(self) -> &'static str {
match self {
LichessSpeed::UltraBullet => "ultraBullet",
LichessSpeed::Bullet => "bullet",
LichessSpeed::Blitz => "blitz",
LichessSpeed::Rapid => "rapid",
LichessSpeed::Classical => "classical",
LichessSpeed::Correspondence => "correspondence",
}
}
#[must_use]
pub fn parse(value: &str) -> Option<Self> {
match value {
"ultraBullet" => Some(LichessSpeed::UltraBullet),
"bullet" => Some(LichessSpeed::Bullet),
"blitz" => Some(LichessSpeed::Blitz),
"rapid" => Some(LichessSpeed::Rapid),
"classical" => Some(LichessSpeed::Classical),
"correspondence" => Some(LichessSpeed::Correspondence),
_ => None,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub enum LichessVariantKey {
Standard,
Chess960,
Crazyhouse,
Antichess,
Atomic,
Horde,
KingOfTheHill,
RacingKings,
ThreeCheck,
FromPosition,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub struct LichessOk {
pub ok: bool,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn color_uses_lowercase() {
assert_eq!(
serde_json::to_string(&LichessColor::Black).unwrap(),
"\"black\""
);
}
#[test]
fn speed_uses_camel_case() {
assert_eq!(
serde_json::from_str::<LichessSpeed>("\"ultraBullet\"").unwrap(),
LichessSpeed::UltraBullet
);
}
#[test]
fn variant_key_uses_camel_case() {
assert_eq!(
serde_json::to_string(&LichessVariantKey::KingOfTheHill).unwrap(),
"\"kingOfTheHill\""
);
assert_eq!(
serde_json::from_str::<LichessVariantKey>("\"chess960\"").unwrap(),
LichessVariantKey::Chess960
);
}
}