mlb_api/requests/jobs/
mod.rs1use 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#[derive(Debug, Deserialize, PartialEq, Clone)]
35pub struct JobsResponse {
36 pub copyright: Copyright,
37 #[serde(default)]
38 pub roster: Vec<EmployedPerson>,
39}
40
41#[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#[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}