Skip to main content

vn_core/model/
staff.rs

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 {}