Skip to main content

mlb_api/requests/team/
coaches.rs

1use crate::person::people::PeopleResponse;
2use crate::season::SeasonId;
3use crate::team::TeamId;
4use crate::types::MLB_API_DATE_FORMAT;
5use crate::request::RequestURL;
6use bon::Builder;
7use chrono::NaiveDate;
8use std::fmt::{Display, Formatter};
9
10#[derive(Builder)]
11#[builder(derive(Into))]
12pub struct CoachesRequest {
13    #[builder(into)]
14    team_id: TeamId,
15    #[builder(into)]
16    season: Option<SeasonId>,
17    date: Option<NaiveDate>,
18}
19
20impl<S: coaches_request_builder::State + coaches_request_builder::IsComplete> crate::request::RequestURLBuilderExt for CoachesRequestBuilder<S> {
21    type Built = CoachesRequest;
22}
23
24impl Display for CoachesRequest {
25    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
26        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)) })
27    }
28}
29
30impl RequestURL for CoachesRequest {
31    type Response = PeopleResponse<()>;
32}
33
34#[cfg(test)]
35mod tests {
36    use crate::request::RequestURLBuilderExt;
37    use crate::team::coaches::CoachesRequest;
38	use crate::team::teams::TeamsRequest;
39    use crate::TEST_YEAR;
40
41    #[tokio::test]
42    #[cfg_attr(not(feature = "_heavy_tests"), ignore)]
43    async fn test_heavy() {
44        let season = TEST_YEAR;
45        let teams = TeamsRequest::mlb_teams().season(season).build_and_get().await.unwrap();
46        for team in teams.teams {
47            let _ = CoachesRequest::builder().team_id(team.id).season(season).build_and_get().await.unwrap();
48        }
49    }
50}