Skip to main content

mlb_api/requests/team/
affiliates.rs

1use crate::season::SeasonId;
2use crate::team::TeamId;
3use crate::team::teams::TeamsResponse;
4use crate::request::RequestURL;
5use bon::Builder;
6use std::fmt::{Display, Formatter};
7
8#[derive(Builder)]
9#[builder(derive(Into))]
10pub struct TeamAffiliatesRequest {
11	#[builder(into)]
12	team_id: TeamId,
13	#[builder(into)]
14	season: Option<SeasonId>,
15}
16
17impl<S: team_affiliates_request_builder::State + team_affiliates_request_builder::IsComplete> crate::request::RequestURLBuilderExt for TeamAffiliatesRequestBuilder<S> {
18	type Built = TeamAffiliatesRequest;
19}
20
21impl Display for TeamAffiliatesRequest {
22	fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
23		write!(f, "http://statsapi.mlb.com/api/v1/teams/{}/affiliates{params}", self.team_id, params = gen_params! { "season"?: self.season })
24	}
25}
26
27impl RequestURL for TeamAffiliatesRequest {
28	type Response = TeamsResponse;
29}
30
31#[cfg(test)]
32mod tests {
33	use crate::request::{Error as RequestError, RequestURLBuilderExt};
34	use crate::team::affiliates::TeamAffiliatesRequest;
35	use crate::team::teams::TeamsRequest;
36	use crate::TEST_YEAR;
37
38	#[tokio::test]
39	async fn all_mlb_teams() {
40		for team in TeamsRequest::mlb_teams().build_and_get().await.unwrap().teams {
41			let _affiliates = TeamAffiliatesRequest::builder().team_id(team.id).build_and_get().await.unwrap();
42		}
43	}
44
45	#[tokio::test]
46	#[cfg_attr(not(feature = "_heavy_tests"), ignore)]
47	async fn all_mlb_teams_all_seasons() {
48		for season in 1876..=TEST_YEAR {
49			for team in TeamsRequest::mlb_teams().build_and_get().await.unwrap().teams {
50				let affiliates_result = TeamAffiliatesRequest::builder().team_id(team.id).season(season).build_and_get().await;
51				match affiliates_result {
52					Ok(_) | Err(RequestError::MLB(_)) => {},
53					Err(e) => panic!("{e}"),
54				}
55			}
56		}
57	}
58}