mlb_api/requests/team/
leaders.rs1use 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#[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 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}