Skip to main content

mlb_api/requests/schedule/
tied.rs

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