mlb_api/endpoints/person/
types.rs1use 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}