mlb_api/requests/
conferences.rs1use crate::league::LeagueId;
2use crate::season::SeasonId;
3use crate::sport::SportId;
4use crate::types::Copyright;
5use crate::request::RequestURL;
6use bon::Builder;
7use derive_more::{Deref, DerefMut};
8use serde::Deserialize;
9use std::fmt::{Display, Formatter};
10use crate::cache::Requestable;
11
12#[cfg(feature = "cache")]
13use crate::{rwlock_const_new, RwLock, cache::CacheTable};
14
15#[derive(Debug, Deserialize, PartialEq, Eq, Clone)]
16#[serde(rename_all = "camelCase")]
17pub struct ConferencesResponse {
18 pub copyright: Copyright,
19 pub conferences: Vec<Conference>,
20}
21
22#[derive(Debug, Deserialize, Deref, DerefMut, Clone)]
23#[serde(rename_all = "camelCase")]
24pub struct Conference {
25 pub abbreviation: String,
26 #[serde(rename = "nameShort")]
27 pub short_name: String,
28 pub has_wildcard: bool,
29 pub league: LeagueId,
30 pub sport: SportId,
31
32 #[deref]
33 #[deref_mut]
34 #[serde(flatten)]
35 inner: NamedConference,
36}
37
38#[derive(Debug, Deserialize, Clone)]
39#[serde(rename_all = "camelCase")]
40pub struct NamedConference {
41 pub name: String,
42 #[serde(flatten)]
43 pub id: ConferenceId,
44}
45
46id!(ConferenceId { id: u32 });
47
48id_only_eq_impl!(Conference, id);
49id_only_eq_impl!(NamedConference, id);
50
51#[derive(Builder)]
52#[builder(derive(Into))]
53pub struct ConferencesRequest {
54 #[builder(into)]
55 conference_id: Option<ConferenceId>,
56 #[builder(into)]
57 season: Option<SeasonId>,
58}
59
60impl<S: conferences_request_builder::State + conferences_request_builder::IsComplete> crate::request::RequestURLBuilderExt for ConferencesRequestBuilder<S> {
61 type Built = ConferencesRequest;
62}
63
64impl Display for ConferencesRequest {
65 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
66 write!(f, "http://statsapi.mlb.com/api/v1/conferences{}", gen_params! { "conferenceId"?: self.conference_id, "season"?: self.season })
67 }
68}
69
70impl RequestURL for ConferencesRequest {
71 type Response = ConferencesResponse;
72}
73
74#[cfg(feature = "cache")]
75static CACHE: RwLock<CacheTable<Conference>> = rwlock_const_new(CacheTable::new());
76
77impl Requestable for Conference {
78 type Identifier = ConferenceId;
79 type URL = ConferencesRequest;
80
81 fn id(&self) -> &Self::Identifier {
82 &self.id
83 }
84
85 #[cfg(feature = "aggressive_cache")]
86 fn url_for_id(_id: &Self::Identifier) -> Self::URL {
87 ConferencesRequest::builder().build()
88 }
89
90 #[cfg(not(feature = "aggressive_cache"))]
91 fn url_for_id(id: &Self::Identifier) -> Self::URL {
92 ConferencesRequest::builder().conference_id(*id).build()
93 }
94
95 fn get_entries(response: <Self::URL as RequestURL>::Response) -> impl IntoIterator<Item=Self>
96 where
97 Self: Sized
98 {
99 response.conferences
100 }
101
102 #[cfg(feature = "cache")]
103 fn get_cache_table() -> &'static RwLock<CacheTable<Self>>
104 where
105 Self: Sized
106 {
107 &CACHE
108 }
109}
110
111entrypoint!(Conference.id => Conference);
112entrypoint!(NamedConference.id => Conference);
113entrypoint!(ConferenceId => Conference);
114
115#[cfg(test)]
116mod tests {
117 use crate::conferences::ConferencesRequest;
118 use crate::request::RequestURLBuilderExt;
119
120 #[tokio::test]
121 async fn parse_all_conferences() {
122 let _response = ConferencesRequest::builder().build_and_get().await.unwrap();
123 }
124}