Skip to main content

mlb_api/requests/schedule/
tied.rs

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