1use super::release::ExternalLink;
2use super::schema::Language;
3use super::{QueryField, SortQueryBy};
4use crate::{impl_id_newtype, impl_into_field_set};
5use regex::Regex;
6use serde::{Deserialize, Serialize};
7use std::sync::{Arc, LazyLock};
8use strum::{Display, EnumIs, EnumString, VariantArray};
9
10static ID_REGEX: LazyLock<Regex> = LazyLock::new(|| Regex::new(r"^s\d+$").unwrap());
11
12#[remain::sorted]
13#[derive(Clone, Debug, Deserialize, Serialize)]
14#[cfg_attr(feature = "specta", derive(specta::Type))]
15pub struct Staff {
16 pub aid: Option<u32>,
17 pub aliases: Option<Vec<StaffAlias>>,
18 pub description: Option<String>,
19 pub extlinks: Option<Vec<ExternalLink>>,
20 pub gender: Option<StaffGender>,
21 pub id: StaffId,
22 pub ismain: Option<bool>,
23 pub lang: Option<Language>,
24 pub name: Option<String>,
25 pub original: Option<String>,
26}
27
28impl From<Staff> for StaffId {
29 fn from(s: Staff) -> Self {
30 s.id
31 }
32}
33
34#[derive(
35 Debug,
36 Deserialize,
37 Serialize,
38 PartialEq,
39 Eq,
40 PartialOrd,
41 Ord,
42 Hash,
43 derive_more::Display,
44 derive_more::Into,
45)]
46#[cfg_attr(feature = "specta", derive(specta::Type))]
47pub struct StaffId(#[cfg_attr(feature = "specta", specta(type = String))] Arc<str>);
48
49impl StaffId {
50 pub const PREFIX: char = 's';
51}
52
53impl_id_newtype!(Staff, StaffId, ID_REGEX);
54
55#[remain::sorted]
56#[derive(Clone, Debug, Deserialize, Serialize)]
57#[cfg_attr(feature = "specta", derive(specta::Type))]
58pub struct StaffAlias {
59 pub aid: Option<u32>,
60 pub ismain: Option<bool>,
61 pub latin: Option<String>,
62 pub name: Option<String>,
63}
64
65#[non_exhaustive]
66#[remain::sorted]
67#[derive(
68 Copy, Clone, Debug, Deserialize, Serialize, PartialEq, Eq, Hash, Display, EnumIs, EnumString,
69)]
70#[cfg_attr(feature = "specta", derive(specta::Type))]
71pub enum StaffGender {
72 #[serde(rename = "f")]
73 #[strum(serialize = "f")]
74 Female,
75
76 #[serde(rename = "m")]
77 #[strum(serialize = "m")]
78 Male,
79}
80
81#[non_exhaustive]
82#[remain::sorted]
83#[derive(Clone, Copy, Debug, Deserialize, Serialize, Display, EnumString, VariantArray)]
84#[cfg_attr(feature = "specta", derive(specta::Type))]
85pub enum StaffField {
86 #[serde(rename = "aid")]
87 #[strum(serialize = "aid")]
88 Aid,
89
90 #[serde(rename = "aliases.aid")]
91 #[strum(serialize = "aliases.aid")]
92 AliasesAid,
93
94 #[serde(rename = "aliases.ismain")]
95 #[strum(serialize = "aliases.ismain")]
96 AliasesIsMain,
97
98 #[serde(rename = "aliases.latin")]
99 #[strum(serialize = "aliases.latin")]
100 AliasesLatin,
101
102 #[serde(rename = "aliases.name")]
103 #[strum(serialize = "aliases.name")]
104 AliasesName,
105
106 #[serde(rename = "description")]
107 #[strum(serialize = "description")]
108 Description,
109
110 #[serde(rename = "extlinks.id")]
111 #[strum(serialize = "extlinks.id")]
112 ExtlinksId,
113
114 #[serde(rename = "extlinks.label")]
115 #[strum(serialize = "extlinks.label")]
116 ExtlinksLabel,
117
118 #[serde(rename = "extlinks.name")]
119 #[strum(serialize = "extlinks.name")]
120 ExtlinksName,
121
122 #[serde(rename = "extlinks.url")]
123 #[strum(serialize = "extlinks.url")]
124 ExtlinksUrl,
125
126 #[serde(rename = "gender")]
127 #[strum(serialize = "gender")]
128 Gender,
129
130 #[serde(rename = "id")]
131 #[strum(serialize = "id")]
132 Id,
133
134 #[serde(rename = "ismain")]
135 #[strum(serialize = "ismain")]
136 IsMain,
137
138 #[serde(rename = "lang")]
139 #[strum(serialize = "lang")]
140 Lang,
141
142 #[serde(rename = "name")]
143 #[strum(serialize = "name")]
144 Name,
145
146 #[serde(rename = "original")]
147 #[strum(serialize = "original")]
148 Original,
149}
150
151impl QueryField for StaffField {}
152
153impl_into_field_set!(StaffField);
154
155#[non_exhaustive]
156#[remain::sorted]
157#[derive(Clone, Copy, Debug, Deserialize, Serialize, Display, EnumString)]
158#[cfg_attr(feature = "specta", derive(specta::Type))]
159pub enum SortStaffBy {
160 #[serde(rename = "id")]
161 #[strum(serialize = "id")]
162 Id,
163
164 #[serde(rename = "name")]
165 #[strum(serialize = "name")]
166 Name,
167
168 #[serde(rename = "searchrank")]
169 #[strum(serialize = "searchrank")]
170 SearchRank,
171}
172
173impl SortQueryBy for SortStaffBy {}