Skip to main content

mlb_api/requests/person/
players.rs

1//! Lists all players in the [sport](SportId) in a given season.
2
3use crate::person::PeopleResponse;
4use crate::season::SeasonId;
5use crate::request::RequestURL;
6use bon::Builder;
7use std::fmt::{Display, Formatter};
8use crate::hydrations::Hydrations;
9use crate::person::PersonHydrations;
10use crate::sport::SportId;
11
12/// Returns a [`PeopleResponse`].
13#[allow(unused)]
14#[derive(Builder)]
15#[builder(derive(Into))]
16pub struct PlayersRequest<H: PersonHydrations> {
17	#[builder(into)]
18	#[builder(default)]
19	sport_id: SportId,
20	#[builder(into)]
21	season: Option<SeasonId>,
22	#[builder(into)]
23	hydrations: H::RequestData,
24}
25
26impl<H: PersonHydrations, S: players_request_builder::State + players_request_builder::IsComplete> crate::request::RequestURLBuilderExt for PlayersRequestBuilder<H, S> {
27	type Built = PlayersRequest<H>;
28}
29
30impl PlayersRequest<()> {
31	pub fn for_sport(sport_id: impl Into<SportId>) -> PlayersRequestBuilder<(), players_request_builder::SetHydrations<players_request_builder::SetSportId>> {
32		Self::builder().sport_id(sport_id).hydrations(<() as Hydrations>::RequestData::default())
33	}
34}
35
36impl<H: PersonHydrations> Display for PlayersRequest<H> {
37	fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
38		write!(f, "http://statsapi.mlb.com/api/v1/sports/{}/players{}", self.sport_id, gen_params! { "sportId": self.sport_id, "season"?: self.season })
39	}
40}
41
42impl<H: PersonHydrations> RequestURL for PlayersRequest<H> {
43	type Response = PeopleResponse<H>;
44}
45
46#[cfg(test)]
47mod tests {
48	use super::*;
49	use crate::TEST_YEAR;
50	use crate::request::RequestURLBuilderExt;
51
52	#[tokio::test]
53	#[cfg_attr(not(feature = "_heavy_tests"), ignore)]
54	async fn parse_all_players_all_seasons_mlb() {
55		for season in 1876..=TEST_YEAR {
56			let _response = PlayersRequest::for_sport(SportId::MLB).season(season).build_and_get().await.unwrap();
57		}
58	}
59
60	#[tokio::test]
61	async fn parse_all_players_mlb() {
62		let _response = PlayersRequest::for_sport(SportId::MLB).build_and_get().await.unwrap();
63	}
64}