Skip to main content

vn_core/model/
producer.rs

1use super::schema::Language;
2use super::{QueryField, SortQueryBy};
3use crate::model::release::ExternalLink;
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"^p\d+$").unwrap());
11
12#[remain::sorted]
13#[derive(Clone, Debug, Deserialize, Serialize)]
14#[cfg_attr(feature = "specta", derive(specta::Type))]
15pub struct Producer {
16  pub aliases: Option<Vec<String>>,
17  pub description: Option<String>,
18  pub extlinks: Option<Vec<ExternalLink>>,
19  pub id: ProducerId,
20  pub lang: Option<Language>,
21  pub name: Option<String>,
22  pub original: Option<String>,
23  pub r#type: Option<ProducerType>,
24}
25
26impl From<Producer> for ProducerId {
27  fn from(p: Producer) -> Self {
28    p.id
29  }
30}
31
32#[derive(
33  Debug,
34  Deserialize,
35  Serialize,
36  PartialEq,
37  Eq,
38  PartialOrd,
39  Ord,
40  Hash,
41  derive_more::Display,
42  derive_more::Into,
43)]
44#[cfg_attr(feature = "specta", derive(specta::Type))]
45pub struct ProducerId(#[cfg_attr(feature = "specta", specta(type = String))] Arc<str>);
46
47impl ProducerId {
48  pub const PREFIX: char = 'p';
49}
50
51impl_id_newtype!(Producer, ProducerId, ID_REGEX);
52
53#[non_exhaustive]
54#[remain::sorted]
55#[derive(
56  Copy, Clone, Debug, Deserialize, Serialize, PartialEq, Eq, Hash, Display, EnumIs, EnumString,
57)]
58#[cfg_attr(feature = "specta", derive(specta::Type))]
59pub enum ProducerType {
60  #[serde(rename = "ng")]
61  #[strum(serialize = "ng")]
62  AmateurGroup,
63
64  #[serde(rename = "co")]
65  #[strum(serialize = "co")]
66  Company,
67
68  #[serde(rename = "in")]
69  #[strum(serialize = "in")]
70  Individual,
71}
72
73#[non_exhaustive]
74#[remain::sorted]
75#[derive(Clone, Copy, Debug, Deserialize, Serialize, Display, EnumString, VariantArray)]
76#[cfg_attr(feature = "specta", derive(specta::Type))]
77pub enum ProducerField {
78  #[serde(rename = "aliases")]
79  #[strum(serialize = "aliases")]
80  Aliases,
81
82  #[serde(rename = "description")]
83  #[strum(serialize = "description")]
84  Description,
85
86  #[serde(rename = "extlinks.id")]
87  #[strum(serialize = "extlinks.id")]
88  ExtlinksId,
89
90  #[serde(rename = "extlinks.label")]
91  #[strum(serialize = "extlinks.label")]
92  ExtlinksLabel,
93
94  #[serde(rename = "extlinks.name")]
95  #[strum(serialize = "extlinks.name")]
96  ExtlinksName,
97
98  #[serde(rename = "extlinks.url")]
99  #[strum(serialize = "extlinks.url")]
100  ExtlinksUrl,
101
102  #[serde(rename = "id")]
103  #[strum(serialize = "id")]
104  Id,
105
106  #[serde(rename = "lang")]
107  #[strum(serialize = "lang")]
108  Lang,
109
110  #[serde(rename = "name")]
111  #[strum(serialize = "name")]
112  Name,
113
114  #[serde(rename = "original")]
115  #[strum(serialize = "original")]
116  Original,
117
118  #[serde(rename = "type")]
119  #[strum(serialize = "type")]
120  Type,
121}
122
123impl QueryField for ProducerField {}
124
125impl_into_field_set!(ProducerField);
126
127#[non_exhaustive]
128#[remain::sorted]
129#[derive(Clone, Copy, Debug, Deserialize, Serialize, Display, EnumString)]
130#[cfg_attr(feature = "specta", derive(specta::Type))]
131pub enum SortProducerBy {
132  #[serde(rename = "id")]
133  #[strum(serialize = "id")]
134  Id,
135
136  #[serde(rename = "name")]
137  #[strum(serialize = "name")]
138  Name,
139
140  #[serde(rename = "searchrank")]
141  #[strum(serialize = "searchrank")]
142  SearchRank,
143}
144
145impl SortQueryBy for SortProducerBy {}