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