Skip to main content

mlb_api/requests/stats/wrappers/
game.rs

1use chrono::{NaiveDate, Utc};
2use derive_more::{Deref, DerefMut};
3use serde::Deserialize;
4use crate::game::GameId;
5use crate::season::SeasonId;
6use crate::stats::{RawStat, SingletonSplitStat};
7use crate::stats::wrappers::{GamePiece, OpposingTeamPiece, SeasonPiece};
8use crate::team::NamedTeam;
9
10#[derive(Debug, Deserialize, PartialEq, Eq, Clone, Deref, DerefMut)]
11#[serde(rename_all = "camelCase")]
12#[serde(bound = "T: RawStat")]
13pub struct WithGame<T: RawStat> {
14	pub opponent: NamedTeam,
15	pub date: NaiveDate,
16	pub is_home: bool,
17	pub game: GameId,
18	pub season: SeasonId,
19
20	#[deref]
21	#[deref_mut]
22	#[serde(rename = "stat")]
23	pub stats: T,
24}
25
26impl<T: RawStat> SeasonPiece for WithGame<T> {
27	fn season(&self) -> &SeasonId {
28		&self.season
29	}
30}
31
32impl<T: RawStat> OpposingTeamPiece for WithGame<T> {
33	fn opposing_team(&self) -> &NamedTeam {
34		&self.opponent
35	}
36}
37
38impl<T: RawStat> GamePiece for WithGame<T> {
39	fn game(&self) -> &GameId {
40		&self.game
41	}
42}
43
44impl<T: RawStat> Default for WithGame<T> {
45	fn default() -> Self {
46		Self {
47			opponent: NamedTeam::unknown_team(),
48			date: Utc::now().date_naive(),
49			is_home: true,
50			game: GameId::new(0),
51			season: SeasonId::current_season(),
52			stats: T::default(),
53		}
54	}
55}
56
57impl<T: RawStat> SingletonSplitStat for WithGame<T> {}