Skip to main content

mlb_api/requests/meta/
positions.rs

1use derive_more::{Deref, DerefMut};
2use serde::Deserialize;
3
4id!(PositionCode { code: String });
5
6#[derive(Debug, Deserialize, Clone, Hash)]
7#[serde(rename_all = "camelCase")]
8pub struct NamedPosition {
9	pub code: PositionCode,
10	#[serde(alias = "displayName")]
11	pub name: String,
12	#[serde(rename = "type")]
13	pub r#type: String,
14	#[serde(alias = "abbrev")]
15	pub abbreviation: String,
16}
17
18impl NamedPosition {
19	#[must_use]
20	pub fn unknown_position() -> Self {
21		Self {
22			code: PositionCode::new("X"),
23			name: "Unknown".to_owned(),
24			r#type: "Unknown".to_owned(),
25			abbreviation: "X".to_owned(),
26		}
27	}
28}
29
30#[allow(clippy::struct_excessive_bools, reason = "false positive")]
31#[derive(Debug, Deserialize, Deref, DerefMut, Clone, Hash)]
32#[serde(rename_all = "camelCase")]
33pub struct Position {
34	pub short_name: String,
35	pub full_name: String,
36	pub formal_name: String,
37	#[serde(rename = "pitcher")]
38	pub is_pitcher: bool,
39	#[serde(rename = "gamePosition")]
40	pub is_game_position: bool,
41	#[serde(rename = "fielder")]
42	pub is_fielder: bool,
43	#[serde(rename = "outfield")]
44	pub is_outfield: bool,
45
46	#[deref]
47	#[deref_mut]
48	#[serde(flatten)]
49	inner: NamedPosition,
50}
51
52impl Position {
53	#[must_use]
54	pub fn unknown_position() -> Self {
55		Self {
56			short_name: "Unknown".to_owned(),
57			full_name: "Unknown".to_owned(),
58			formal_name: "Unknown".to_owned(),
59			is_pitcher: false,
60			is_game_position: false,
61			is_fielder: false,
62			is_outfield: false,
63			inner: NamedPosition::unknown_position(),
64		}
65	}
66}
67
68id_only_eq_impl!(Position, code);
69id_only_eq_impl!(NamedPosition, code);
70meta_kind_impl!("positions" => Position);
71tiered_request_entry_cache_impl!([Position, NamedPosition].code: PositionCode);
72test_impl!(Position);