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