Skip to main content

mlb_api/requests/jobs/
mod.rs

1//! Jobs data.
2//! 
3//! Lists of different people with different positions
4
5use crate::person::{JerseyNumber, NamedPerson};
6use crate::{Copyright, MLB_API_DATE_FORMAT};
7use bon::Builder;
8use chrono::NaiveDate;
9use serde::Deserialize;
10use serde_with::{serde_as, DefaultOnError};
11use std::fmt::{Display, Formatter};
12use crate::meta::JobTypeId;
13use crate::request::RequestURL;
14use crate::sport::SportId;
15
16mod datacasters;
17mod official_scorers;
18mod umpire;
19
20pub use datacasters::*;
21pub use official_scorers::*;
22pub use umpire::*;
23
24/// Response from the `jobs` endpoints.
25/// Returns a [`Vec`] of [`EmployedPerson`]
26///
27/// Example: <http://statsapi.mlb.com/api/v1/jobs?jobType=UMPR>
28///
29/// This type represents the response for:
30/// - [`JobsRequest`]
31/// - [`JobsDatacastersRequest`]
32/// - [`JobsOfficialScorersRequest`]
33/// - [`JobsUmpiresRequest`]
34#[derive(Debug, Deserialize, PartialEq, Clone)]
35pub struct JobsResponse {
36    pub copyright: Copyright,
37    #[serde(default)]
38    pub roster: Vec<EmployedPerson>,
39}
40
41/// Person with a job
42///
43/// Wrapper of [`NamedPerson`] used in the [`JobsRequest`] endpoints that contains extra fields about their job.
44#[serde_as]
45#[derive(Debug, Deserialize, PartialEq, Clone)]
46#[serde(rename_all = "camelCase")]
47pub struct EmployedPerson {
48    #[serde(default = "NamedPerson::unknown_person")]
49    pub person: NamedPerson,
50	#[serde(default)]
51	#[serde_as(deserialize_as = "DefaultOnError")]
52    pub jersey_number: Option<JerseyNumber>,
53    #[serde(rename = "job")] pub job_name: String,
54    pub job_id: JobTypeId,
55    #[serde(rename = "title")] pub job_title: String,
56}
57
58/// Returns [`JobsResponse`].
59///
60/// Example: <http://statsapi.mlb.com/api/v1/jobs?jobType=UMPR>
61#[derive(Builder)]
62#[builder(derive(Into))]
63pub struct JobsRequest {
64    #[builder(into)]
65    job_type: JobTypeId,
66    #[builder(into, default)]
67    sport_id: SportId,
68    date: Option<NaiveDate>,
69}
70
71impl<S: jobs_request_builder::State + jobs_request_builder::IsComplete> crate::request::RequestURLBuilderExt for JobsRequestBuilder<S> {
72    type Built = JobsRequest;
73}
74
75impl Display for JobsRequest {
76    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
77        write!(f, "http://statsapi.mlb.com/api/v1/jobs{}", gen_params! {
78            "jobType": self.job_type,
79            "sportId": self.sport_id,
80            "date"?: self.date.as_ref().map(|date| date.format(MLB_API_DATE_FORMAT))
81        })
82    }
83}
84
85impl RequestURL for JobsRequest {
86	type Response = JobsResponse;
87}
88
89#[cfg(test)]
90mod tests {
91    use crate::meta::JobType;
92    use crate::jobs::JobsRequest;
93    use crate::meta::MetaRequest;
94    use crate::request::{RequestURL, RequestURLBuilderExt};
95
96    #[tokio::test]
97    async fn parse_all_job_types() {
98        let job_types = MetaRequest::<JobType>::new().get().await.unwrap().entries;
99        for job_type in job_types {
100            let _response = JobsRequest::builder().job_type(job_type.id.clone()).build_and_get().await.unwrap();
101        }
102    }
103}