vn_core/model/
producer.rs1use 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 {}