mlb_api/requests/team/
coaches.rs1use crate::person::PeopleResponse;
4use crate::season::SeasonId;
5use crate::team::TeamId;
6use crate::MLB_API_DATE_FORMAT;
7use crate::request::RequestURL;
8use bon::Builder;
9use chrono::NaiveDate;
10use std::fmt::{Display, Formatter};
11use crate::hydrations::Hydrations;
12use crate::person::PersonHydrations;
13
14#[derive(Builder)]
15#[builder(derive(Into))]
16pub struct CoachesRequest<H: PersonHydrations = ()> {
17 #[builder(into)]
18 team_id: TeamId,
19 #[builder(into)]
20 season: Option<SeasonId>,
21 date: Option<NaiveDate>,
22 #[builder(into)]
23 hydrations: H::RequestData,
24}
25
26impl CoachesRequest {
27 pub fn for_team(team_id: impl Into<TeamId>) -> CoachesRequestBuilder<(), coaches_request_builder::SetHydrations<coaches_request_builder::SetTeamId>> {
28 Self::builder()
29 .team_id(team_id.into())
30 .hydrations(())
31 }
32}
33
34impl<H: PersonHydrations, S: coaches_request_builder::State + coaches_request_builder::IsComplete> crate::request::RequestURLBuilderExt for CoachesRequestBuilder<H, S> {
35 type Built = CoachesRequest<H>;
36}
37
38impl<H: PersonHydrations> Display for CoachesRequest<H> {
39 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
40 let hydrations = Some(H::hydration_text(&self.hydrations)).filter(|s| !s.is_empty());
41 write!(f, "http://statsapi.mlb.com/api/v1/teams/{}/coaches{}", self.team_id, gen_params! { "season"?: self.season, "date"?: self.date.as_ref().map(|date| date.format(MLB_API_DATE_FORMAT)), "hydrate"?: hydrations })
42 }
43}
44
45impl<H: PersonHydrations> RequestURL for CoachesRequest<H> {
46 type Response = PeopleResponse<H>;
47}
48
49#[cfg(test)]
50mod tests {
51 use crate::request::RequestURLBuilderExt;
52 use crate::team::coaches::CoachesRequest;
53 use crate::team::TeamsRequest;
54 use crate::TEST_YEAR;
55
56 #[tokio::test]
57 #[cfg_attr(not(feature = "_heavy_tests"), ignore)]
58 async fn test_heavy() {
59 let season = TEST_YEAR;
60 let teams = TeamsRequest::mlb_teams().season(season).build_and_get().await.unwrap();
61 for team in teams.teams {
62 let _ = CoachesRequest::<()>::for_team(team.id).season(season).build_and_get().await.unwrap();
63 }
64 }
65}