mlb_api/requests/schedule/
tied.rs1use 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}