Skip to main content

mlb_api/requests/team/
teams.rs

1use 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/// Hydrations:
11/// * `previousSchedule`
12/// * `nextSchedule`
13/// * `venue`
14/// * `springVenue`
15/// * `social`
16/// * `deviceProperties`
17/// * `game(promotions)`
18/// * `game(atBatPromotions)`
19/// * `game(tickets)`
20/// * `game(atBatTickets)`
21/// * `game(sponsorships)`
22/// * `league`
23/// * `person`
24/// * `sport`
25/// * `standings`
26/// * `division`
27/// * `xrefId`
28/// * `location`
29#[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}