mlb_api/requests/team/stats.rs
1// todo
2
3// #![allow(clippy::trait_duplication_in_bounds, reason = "serde")]
4//
5// use crate::meta::GameType;
6// use crate::person::PersonId;
7// use crate::request::RequestURL;
8// use crate::season::SeasonId;
9// use crate::sport::SportId;
10// use crate::meta::StatGroup;
11// use crate::meta::StatType;
12// use crate::stats::Stats;
13// use crate::team::TeamId;
14// use crate::{Copyright, MLB_API_DATE_FORMAT};
15// use bon::Builder;
16// use chrono::NaiveDate;
17// use either::Either;
18// use itertools::Itertools;
19// use serde::Deserialize;
20// use std::fmt::{Display, Formatter};
21// use std::marker::PhantomData;
22//
23// #[derive(Debug, Deserialize, PartialEq, Clone)]
24// #[serde(bound = "S: Stats")]
25// pub struct TeamsStatsResponse<S: Stats> {
26// pub copyright: Copyright,
27// pub stats: S,
28// }
29//
30// #[derive(Builder)]
31// #[builder(derive(Into))]
32// #[builder(start_fn(vis = ""))]
33// pub struct TeamsStatsRequest<S: Stats> {
34// #[builder(setters(vis = "", name = __id_internal))]
35// pub id: Either<TeamId, SportId>,
36// #[builder(into)]
37// pub season: Option<SeasonId>,
38// pub game_type: GameType,
39// pub stat_types: Vec<StatType>,
40// pub stat_groups: Vec<StatGroup>,
41// pub start_date: Option<NaiveDate>,
42// pub end_date: Option<NaiveDate>,
43// #[builder(into)]
44// pub opposing_player: Option<PersonId>,
45// #[builder(into)]
46// pub opposing_team: Option<PersonId>,
47// #[builder(skip)]
48// _marker: PhantomData<S>,
49// }
50//
51// impl<S: Stats, State: teams_stats_request_builder::State + teams_stats_request_builder::IsComplete> crate::request::RequestURLBuilderExt for TeamsStatsRequestBuilder<S, State> {
52// type Built = TeamsStatsRequest<S>;
53// }
54//
55// impl<S: Stats> TeamsStatsRequest<S> {
56// pub fn for_team(team_id: impl Into<TeamId>) -> TeamsStatsRequestBuilder<S, teams_stats_request_builder::SetId> {
57// Self::builder().__id_internal(Either::Left(team_id.into()))
58// }
59//
60// pub fn for_sport(sport_id: impl Into<SportId>) -> TeamsStatsRequestBuilder<S, teams_stats_request_builder::SetId> {
61// Self::builder().__id_internal(Either::Right(sport_id.into()))
62// }
63// }
64//
65// impl<S: Stats> Display for TeamsStatsRequest<S> {
66// #[allow(clippy::cognitive_complexity, reason = "still readable")]
67// fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
68// match self.id {
69// Either::Left(id ) => write!(
70// f,
71// "http://statsapi.mlb.com/api/v1/teams/{id}/stats{params}",
72// params = gen_params! {
73// "season"?: self.season,
74// "gameType": self.game_type,
75// "stats": self.stat_types.iter().join(","),
76// "group": self.stat_groups.iter().join(","),
77// "startDate"?: self.start_date.map(|x| x.format(MLB_API_DATE_FORMAT)),
78// "endDate"?: self.start_date.map(|x| x.format(MLB_API_DATE_FORMAT)),
79// "opposingPlayerId"?: self.opposing_player,
80// "opposingTeamId"?: self.opposing_team,
81// }
82// ),
83// Either::Right(id) => write!(
84// f,
85// "http://statsapi.mlb.com/api/v1/teams/stats{params}",
86// params = gen_params! {
87// "season"?: self.season,
88// "gameType": self.game_type,
89// "stats": self.stat_types.iter().join(","),
90// "group": self.stat_groups.iter().join(","),
91// "sportId": id,
92// "startDate"?: self.start_date.map(|x| x.format(MLB_API_DATE_FORMAT)),
93// "endDate"?: self.start_date.map(|x| x.format(MLB_API_DATE_FORMAT)),
94// "opposingPlayerId"?: self.opposing_player,
95// "opposingTeamId"?: self.opposing_team,
96// }
97// ),
98// }
99// }
100// }
101//
102// impl<S: Stats> RequestURL for TeamsStatsRequest<S> {
103// type Response = TeamsStatsResponse<S>;
104// }