mlb_api/endpoints/league/
types.rs1use 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#[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}