use serde::Deserialize;
id!(#[doc = "A [`String`] representing the [`GameStatus`]"] GameStatusId { detailedState: String });
#[derive(Debug, Deserialize, PartialEq, Eq, Copy, Clone)]
pub enum CodedGameState {
#[serde(rename = "S")]
Scheduled,
#[serde(rename = "P")]
PreGame,
#[serde(rename = "I")]
InProgress,
#[serde(rename = "M")]
ManagerChallenge,
#[serde(rename = "N")]
UmpireReview,
#[serde(rename = "D")]
Postponed,
#[serde(rename = "C")]
Cancelled,
#[serde(rename = "F", alias = "O")] Finished,
#[serde(rename = "T", alias = "U")] Suspended,
#[serde(rename = "Q", alias = "R")] Forfeit,
#[serde(rename = "W")]
Writing,
#[serde(rename = "X")]
Unknown,
}
#[derive(Debug, Deserialize, PartialEq, Eq, Copy, Clone)]
pub enum AbstractGameCode {
#[serde(rename = "P")]
Preview,
#[serde(rename = "L")]
Live,
#[serde(rename = "F")]
Finished,
#[serde(rename = "O")]
Other,
}
impl AbstractGameCode {
#[must_use]
pub const fn has_begun(self) -> bool {
matches!(self, Self::Live | Self::Finished | Self::Other)
}
#[must_use]
pub const fn has_ended(self) -> bool {
matches!(self, Self::Finished | Self::Other)
}
#[must_use]
pub const fn is_preview(self) -> bool {
matches!(self, Self::Preview)
}
#[must_use]
pub const fn is_live(self) -> bool {
matches!(self, Self::Live)
}
#[must_use]
pub const fn is_finished(self) -> bool {
matches!(self, Self::Finished)
}
#[must_use]
pub const fn is_unknown(self) -> bool {
matches!(self, Self::Other)
}
}
#[derive(Debug, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct GameStatus {
pub abstract_game_state: String,
pub coded_game_state: CodedGameState,
pub status_code: String,
pub reason: Option<String>,
pub abstract_game_code: AbstractGameCode,
#[serde(flatten)]
pub id: GameStatusId,
}
id_only_eq_impl!(GameStatus, id);
meta_kind_impl!("gameStatus" => GameStatus);
tiered_request_entry_cache_impl!(GameStatus.id: GameStatusId);
test_impl!(GameStatus);