Skip to main content

mlb_api/requests/jobs/
mod.rs

1use crate::person::NamedPerson;
2use crate::types::{Copyright, MLB_API_DATE_FORMAT};
3use bon::Builder;
4use chrono::NaiveDate;
5use serde::Deserialize;
6use std::fmt::{Display, Formatter};
7use crate::job_types::JobTypeId;
8use crate::request::RequestURL;
9use crate::sport::SportId;
10
11pub mod datacasters;
12pub mod official_scorers;
13pub mod umpire;
14
15#[derive(Debug, Deserialize, PartialEq, Eq, Clone)]
16pub struct JobsResponse {
17    pub copyright: Copyright,
18    #[serde(default)]
19    pub roster: Vec<EmployedPerson>,
20}
21
22#[derive(Debug, Deserialize, PartialEq, Eq, Clone)]
23#[serde(rename_all = "camelCase")]
24pub struct EmployedPerson {
25    #[serde(default = "NamedPerson::unknown_person")]
26    pub person: NamedPerson,
27    #[serde(deserialize_with = "crate::types::try_from_str")]
28    pub jersey_number: Option<u8>,
29    #[serde(rename = "job")] pub job_name: String,
30    pub job_id: JobTypeId,
31    #[serde(rename = "title")] pub job_title: String,
32}
33
34#[derive(Builder)]
35#[builder(derive(Into))]
36pub struct JobsRequest {
37    #[builder(into)]
38    job_type: JobTypeId,
39    #[builder(into, default)]
40    sport_id: SportId,
41    date: Option<NaiveDate>,
42}
43
44impl<S: jobs_request_builder::State + jobs_request_builder::IsComplete> crate::request::RequestURLBuilderExt for JobsRequestBuilder<S> {
45    type Built = JobsRequest;
46}
47
48impl Display for JobsRequest {
49    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
50        write!(f, "http://statsapi.mlb.com/api/v1/jobs{}", gen_params! {
51            "jobType": self.job_type,
52            "sportId": self.sport_id,
53            "date"?: self.date.as_ref().map(|date| date.format(MLB_API_DATE_FORMAT))
54        })
55    }
56}
57
58impl RequestURL for JobsRequest {
59	type Response = JobsResponse;
60}
61
62#[cfg(test)]
63mod tests {
64    use crate::job_types::JobType;
65    use crate::jobs::JobsRequest;
66    use crate::meta::MetaRequest;
67    use crate::request::{RequestURL, RequestURLBuilderExt};
68
69    #[tokio::test]
70    async fn parse_all_job_types() {
71        let job_types = MetaRequest::<JobType>::new().get().await.unwrap().entries;
72        for job_type in job_types {
73            let _response = JobsRequest::builder().job_type(job_type.id.clone()).build_and_get().await.unwrap();
74        }
75    }
76}