mlb_api/requests/jobs/
mod.rs1use 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}