mlb_api/requests/team/
teams.rs1use crate::season::SeasonId;
2use crate::types::Copyright;
3use crate::request::RequestURL;
4use bon::Builder;
5use serde::Deserialize;
6use std::fmt::{Display, Formatter};
7use crate::sport::SportId;
8use crate::team::Team;
9
10#[derive(Debug, Deserialize, PartialEq, Eq, Clone)]
30#[serde(rename_all = "camelCase")]
31pub struct TeamsResponse {
32 pub copyright: Copyright,
33 pub teams: Vec<Team>,
34}
35
36#[derive(Builder)]
37#[builder(start_fn(vis = ""))]
38#[builder(derive(Into))]
39pub struct TeamsRequest {
40 #[builder(setters(vis = "", name = "sport_id_internal"))]
41 sport_id: Option<SportId>,
42 #[builder(into)]
43 season: Option<SeasonId>,
44}
45
46impl TeamsRequest {
47 pub fn for_sport(sport_id: SportId) -> TeamsRequestBuilder<teams_request_builder::SetSportId> {
48 Self::builder().sport_id_internal(sport_id)
49 }
50
51 pub fn mlb_teams() -> TeamsRequestBuilder<teams_request_builder::SetSportId> {
52 Self::builder().sport_id_internal(SportId::MLB)
53 }
54
55 pub fn all_sports() -> TeamsRequestBuilder {
56 Self::builder()
57 }
58}
59
60impl<S: teams_request_builder::State + teams_request_builder::IsComplete> crate::request::RequestURLBuilderExt for TeamsRequestBuilder<S> {
61 type Built = TeamsRequest;
62}
63
64impl Display for TeamsRequest {
65 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
66 write!(f, "http://statsapi.mlb.com/api/v1/teams{}", gen_params! { "sportId"?: self.sport_id, "season"?: self.season })
67 }
68}
69
70impl RequestURL for TeamsRequest {
71 type Response = TeamsResponse;
72}
73
74#[cfg(test)]
75mod tests {
76 use crate::request::RequestURLBuilderExt;
77 use crate::TEST_YEAR;
78 use super::*;
79
80 #[tokio::test]
81 #[cfg_attr(not(feature = "_heavy_tests"), ignore)]
82 async fn parse_all_teams_all_seasons() {
83 for season in 1871..=TEST_YEAR {
84 let _response = TeamsRequest::all_sports().season(season).build_and_get().await.unwrap();
85 }
86 }
87
88 #[tokio::test]
89 async fn parse_all_mlb_teams_this_season() {
90 let _ = TeamsRequest::mlb_teams().build_and_get().await.unwrap();
91 }
92}