Skip to main content

mlb_api/requests/schedule/postseason/
mod.rs

1//! Postseason schedule info and endpoints.
2
3pub 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}