mlb_api/requests/schedule/postseason/
mod.rs1pub mod series;
4
5use crate::meta::GameType;
6use crate::request::RequestURL;
7use crate::schedule::{ScheduleHydrations, ScheduleResponse};
8use crate::season::SeasonId;
9use crate::sport::SportId;
10use crate::team::TeamId;
11use bon::Builder;
12use itertools::Itertools;
13use std::fmt::{Display, Formatter};
14use std::marker::PhantomData;
15
16#[derive(Builder)]
17#[builder(derive(Into))]
18pub struct SchedulePostseasonRequest<H: ScheduleHydrations> {
19 #[builder(into)]
20 season: SeasonId,
21 #[builder(into)]
22 #[builder(default)]
23 sport_id: SportId,
24 #[builder(into)]
25 team_id: Option<TeamId>,
26 game_types: Option<Vec<GameType>>,
27 series_number: Option<u32>,
28 #[builder(skip)]
29 _marker: PhantomData<H>,
30}
31
32impl<H: ScheduleHydrations, S: schedule_postseason_request_builder::State + schedule_postseason_request_builder::IsComplete> crate::request::RequestURLBuilderExt for SchedulePostseasonRequestBuilder<H, S> {
33 type Built = SchedulePostseasonRequest<H>;
34}
35
36impl<H: ScheduleHydrations> Display for SchedulePostseasonRequest<H> {
37 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
38 let hydrations = Some(H::hydration_text(&())).filter(|s| !s.is_empty());
39
40 write!(
41 f,
42 "http://statsapi.mlb.com/api/v1/schedule/postseason{params}",
43 params = gen_params! {
44 "season": self.season,
45 "sportId": self.sport_id,
46 "teamId"?: self.team_id,
47 "gameTypes"?: self.game_types.as_ref().map(|x| x.iter().map(|g| format!("{g:?}")).join(",")),
48 "seriesNumber"?: self.series_number,
49 "hydrate"?: hydrations,
50 }
51 )
52 }
53}
54
55impl<H: ScheduleHydrations> RequestURL for SchedulePostseasonRequest<H> {
56 type Response = ScheduleResponse<H>;
57}
58
59#[cfg(test)]
60mod tests {
61 use crate::TEST_YEAR;
62 use crate::request::RequestURLBuilderExt;
63 use crate::schedule::postseason::SchedulePostseasonRequest;
64
65 #[tokio::test]
66 async fn test_one_season() {
67 let _ = SchedulePostseasonRequest::<()>::builder().season(TEST_YEAR).build_and_get().await.unwrap();
68 }
69
70 #[tokio::test]
71 #[cfg_attr(not(feature = "_heavy_tests"), ignore)]
72 async fn test_all_seasons() {
73 for season in 1876..=TEST_YEAR {
74 let _ = SchedulePostseasonRequest::<()>::builder().season(season).build_and_get().await.unwrap();
75 }
76 }
77}