Skip to main content

mlb_api/requests/
conferences.rs

1use 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}