mlb_api/requests/stats/wrappers/
game.rs1use 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> {}