mlb_api/endpoints/person/
types.rs

1use chrono::NaiveDate;
2use derive_more::{Deref, Display};
3use serde::Deserialize;
4use crate::endpoints::types::{Gender, Handedness, HeightMeasurement, Position};
5
6#[derive(Debug, Deref, Deserialize, PartialEq, Eq, Clone)]
7#[serde(rename_all = "camelCase")]
8pub struct Ballplayer {
9    #[deref]
10    #[serde(flatten)]
11    pub inner: DetailedNamedPerson,
12
13    #[serde(deserialize_with = "crate::endpoints::types::from_str")]
14    pub primary_number: u8,
15    pub current_age: u8,
16    #[serde(flatten)]
17    pub birth_data: BirthData,
18    #[serde(flatten)]
19    pub body_measurements: BodyMeasurements,
20    pub gender: Gender,
21    pub draft_year: u16,
22    #[serde(rename = "mlbDebutDate")] pub mlb_debut: NaiveDate,
23    pub bat_side: Handedness,
24    pub pitch_hand: Handedness,
25    #[serde(flatten)]
26    pub strike_zone: StrikeZone,
27}
28
29#[derive(Debug, Deserialize, PartialEq, Eq, Clone)]
30#[serde(rename_all = "camelCase")]
31pub struct BirthData {
32    pub birth_date: NaiveDate,
33    pub birth_city: String,
34    #[serde(rename = "birthStateProvince")] pub birth_state_or_province: String,
35    pub birth_country: String,
36}
37
38#[derive(Debug, Deserialize, PartialEq, Eq, Clone)]
39#[serde(rename_all = "camelCase")]
40pub struct BodyMeasurements {
41    #[serde(deserialize_with = "crate::endpoints::types::from_str")]
42    pub height: HeightMeasurement,
43    pub weight: u16,
44}
45
46#[derive(Debug, Deserialize, PartialEq, Clone)]
47#[serde(rename_all = "camelCase")]
48pub struct StrikeZone {
49    pub strike_zone_top: f64,
50    pub strike_zone_bottom: f64,
51}
52
53impl Eq for StrikeZone {}
54
55#[derive(Debug, Deref, Deserialize, PartialEq, Eq, Clone)]
56#[serde(rename_all = "camelCase")]
57pub struct DetailedNamedPerson {
58    #[deref]
59    #[serde(flatten)]
60    pub inner: NamedPerson,
61    
62    pub primary_position: Position,
63
64    pub first_name: String,
65    pub middle_name: Option<String>,
66    pub last_name: String,
67    #[serde(rename = "useName")] pub use_first_name: String,
68    pub use_last_name: String,
69    pub boxscore_name: String,
70    
71    pub is_player: bool,
72    pub is_verified: bool,
73    pub active: bool,
74}
75
76impl DetailedNamedPerson {
77    #[must_use]
78    pub fn name_first_last(&self) -> String {
79        format!("{0} {1}", self.first_name, self.last_name)
80    }
81
82    #[must_use]
83    pub fn name_last_first(&self) -> String {
84        format!("{1}, {0}", self.first_name, self.last_name)
85    }
86
87    #[must_use]
88    pub fn name_last_first_initial(&self) -> String {
89        if let Some(char) = self.first_name.chars().next() {
90            format!("{1}, {0}", char, self.last_name)
91        } else {
92            self.last_name.clone()
93        }
94    }
95
96    #[must_use]
97    pub fn name_first_initial_last(&self) -> String {
98        if let Some(char) = self.first_name.chars().next() {
99            format!("{0} {1}", char, self.last_name)
100        } else {
101            self.last_name.clone()
102        }
103    }
104
105    #[must_use]
106    pub fn name_fml(&self) -> String {
107        if let Some(middle) = &self.middle_name {
108            format!("{0} {1} {2}", self.first_name, middle, self.last_name)
109        } else {
110            format!("{0} {1}", self.first_name, self.last_name)
111        }
112    }
113
114    #[must_use]
115    pub fn name_lfm(&self) -> String {
116        if let Some(middle) = &self.middle_name {
117            format!("{2}, {0} {1}", self.first_name, middle, self.last_name)
118        } else {
119            format!("{1}, {0}", self.first_name, self.last_name)
120        }
121    }
122}
123
124#[derive(Debug, Deserialize, PartialEq, Eq, Clone)]
125#[serde(rename_all = "camelCase")]
126pub struct NamedPerson {
127    pub id: PersonId,
128    pub full_name: String,
129}
130
131#[repr(transparent)]
132#[derive(Debug, Deref, Display, Deserialize, PartialEq, Eq, Clone)]
133pub struct PersonId(u32);
134
135#[derive(Debug, Deserialize, PartialEq, Eq, Clone)]
136#[serde(untagged)]
137pub enum Person {
138    Ballplayer(Ballplayer),
139    DetailedNamedPerson(DetailedNamedPerson),
140    NamedPerson(NamedPerson),
141}