mlb_api/endpoints/league/
types.rs

1use std::ops::{Deref, DerefMut};
2use derive_more::{Deref, DerefMut, Display};
3use serde::Deserialize;
4use crate::endpoints::seasons::season::{Season, SeasonState};
5use crate::endpoints::sports::Sport;
6
7#[derive(Debug, Deserialize, PartialEq, Eq, Clone)]
8#[serde(rename_all = "camelCase")]
9pub struct LeagueResponse {
10    pub copyright: String,
11    pub leagues: Vec<HydratedLeague>,
12}
13
14#[derive(Debug, Deserialize, PartialEq, Eq, Clone)]
15#[serde(rename_all = "camelCase")]
16pub struct UnhydratedLeague {
17    pub id: LeagueId,
18    pub name: String,
19}
20
21#[derive(Debug, Deserialize, Deref, DerefMut, PartialEq, Eq, Clone)]
22#[serde(rename_all = "camelCase")]
23pub struct HydratedLeague {
24    #[deref]
25    #[deref_mut]
26    inner: UnhydratedLeague,
27    pub abbreviation: String,
28    #[serde(rename = "nameShort")] pub short_name: String,
29    #[serde(rename = "orgCode")] pub code: String,
30    pub season_state: SeasonState,
31    #[serde(flatten, deserialize_with = "bad_league_season_schema_deserializer")]
32    #[serde(rename = "seasonDateInfo")] pub season: Season,
33    pub has_split_season: bool,
34    pub num_games: u8,
35    pub has_playoff_points: bool,
36    pub num_teams: u8,
37    pub num_wildcard_teams: Option<u8>,
38    #[serde(rename = "conferencesInUse")] pub has_conferences: bool,
39    #[serde(rename = "divisionsInUse")] pub has_divisions: bool,
40    pub sport: Option<Sport>,
41    pub sort_order: u32,
42    pub active: bool,
43}
44
45// this is annoying me that it exists
46#[derive(Deserialize)]
47struct BadLeagueSeasonSchema {
48    #[serde(rename = "hasWildCard")] has_wildcard: bool,
49    #[serde(rename = "seasonDateInfo")] rest: Season,
50}
51
52fn bad_league_season_schema_deserializer<'de, D: serde::Deserializer<'de>>(deserializer: D) -> Result<Season, D::Error> {
53    let BadLeagueSeasonSchema { has_wildcard, mut rest } = BadLeagueSeasonSchema::deserialize(deserializer)?;
54    rest.has_wildcard = has_wildcard;
55    Ok(rest)
56}
57
58#[repr(transparent)]
59#[derive(Debug, Deserialize, Deref, Display, PartialEq, Eq, Copy, Clone)]
60pub struct LeagueId(u32);
61
62#[derive(Debug, Deserialize, PartialEq, Eq, Clone)]
63#[serde(untagged)]
64pub enum League {
65    Hydrated(HydratedLeague),
66    Unhydrated(UnhydratedLeague),
67}
68
69impl Deref for League {
70    type Target = UnhydratedLeague;
71
72    fn deref(&self) -> &Self::Target {
73        match self {
74            Self::Hydrated(inner) => inner,
75            Self::Unhydrated(inner) => inner,
76        }
77    }
78}
79
80impl DerefMut for League {
81    fn deref_mut(&mut self) -> &mut Self::Target {
82        match self {
83            Self::Hydrated(inner) => inner,
84            Self::Unhydrated(inner) => inner,
85        }
86    }
87}