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