Skip to main content

mlb_api/requests/team/
leaders.rs

1//! Stat Leaders per stat in a team. Returns a [`TeamStatLeadersResponse`].
2
3use crate::season::SeasonId;
4use crate::stats::leaders::StatLeaders;
5use crate::team::TeamId;
6use crate::{Copyright, PlayerPool};
7use bon::Builder;
8use itertools::Itertools;
9use serde::Deserialize;
10use std::fmt::{Display, Formatter};
11use crate::meta::BaseballStatId;
12use crate::meta::GameType;
13use crate::request::RequestURL;
14
15#[derive(Debug, Deserialize, PartialEq, Clone)]
16#[serde(rename_all = "camelCase")]
17pub struct TeamStatLeadersResponse {
18	pub copyright: Copyright,
19	pub team_leaders: Vec<StatLeaders>,
20}
21
22/// Stat leaders per team
23#[derive(Builder)]
24#[builder(derive(Into))]
25pub struct TeamStatLeadersRequest {
26	#[builder(into)]
27	pub team_id: TeamId,
28	pub stats: Vec<BaseballStatId>,
29	#[builder(into)]
30	pub season: SeasonId,
31	#[builder(default)]
32	pub pool: PlayerPool,
33
34	/// [`None`] represents matching for all [`GameType`]s.
35	pub game_types: Option<Vec<GameType>>,
36}
37
38impl<S: team_stat_leaders_request_builder::State + team_stat_leaders_request_builder::IsComplete> crate::request::RequestURLBuilderExt for TeamStatLeadersRequestBuilder<S> {
39	type Built = TeamStatLeadersRequest;
40}
41
42impl Display for TeamStatLeadersRequest {
43	fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
44		write!(
45			f,
46			"http://statsapi.mlb.com/api/v1/teams/{}/leaders{params}",
47			self.team_id,
48			params = gen_params! {
49				"leaderCategories": self.stats.iter().join(","),
50				"season": self.season,
51				"pool": self.pool,
52				"game_types"?: self.game_types.as_ref().map(|x| x.iter().join(",")),
53			}
54		)
55	}
56}
57
58impl RequestURL for TeamStatLeadersRequest {
59	type Response = TeamStatLeadersResponse;
60}
61
62#[cfg(test)]
63mod tests {
64	use crate::TEST_YEAR;
65    use crate::meta::{MetaRequest, BaseballStat};
66	use crate::request::{RequestURL, RequestURLBuilderExt};
67	use crate::team::leaders::TeamStatLeadersRequest;
68	use crate::team::TeamsRequest;
69
70	#[tokio::test]
71	async fn test_all_mlb_teams_all_stats() {
72		let all_stats = MetaRequest::<BaseballStat>::new().get().await.unwrap().entries.into_iter().map(|stat| stat.id.clone()).collect::<Vec<_>>();
73
74		for team in TeamsRequest::mlb_teams().build_and_get().await.unwrap().teams {
75			let request = TeamStatLeadersRequest::builder().team_id(team.id).season(TEST_YEAR).stats(all_stats.clone()).build();
76			let _all_stats = request.get()
77			.await
78			.unwrap_or_else(|_| panic!("expected team #{} to be valid; {request}", team.id));
79		}
80	}
81}