1use std::str::FromStr;
2
3use arrayvec::ArrayVec;
4use serde::de::Unexpected;
5use serde::Deserializer;
6use serde::Deserialize;
7use serde_repr::Deserialize_repr;
8use serde_repr::Serialize_repr;
9
10#[derive(Clone, Copy, Debug, Deserialize_repr, Eq, PartialEq, Serialize_repr, strum::IntoStaticStr)]
11#[repr(u8)]
12pub enum Genre {
14 Action = 0,
15 Adult = 1,
16 Adventure = 2,
17 Animation = 3,
18 Biography = 4,
19 Comedy = 5,
20 Crime = 6,
21 Documentary = 7,
22 Drama = 8,
23 Experimental = 9,
24 Family = 10,
25 Fantasy = 11,
26 FilmNoir = 12,
27 GameShow = 13,
28 History = 14,
29 Horror = 15,
30 Music = 16,
31 Musical = 17,
32 Mystery = 18,
33 News = 19,
34 RealityTv = 20,
35 Romance = 21,
36 SciFi = 22,
37 Short = 23,
38 Sport = 24,
39 TalkShow = 25,
40 Thriller = 26,
41 War = 27,
42 Western = 28
43} impl FromStr for Genre {
46 type Err = crate::Error;
47 #[inline]
48 fn from_str(s: &str) -> Result<Self, Self::Err> {
49 Ok(match s {
50 "Action" => Self::Action,
51 "Adult" => Self::Adult,
52 "Adventure" => Self::Adventure,
53 "Animation" => Self::Animation,
54 "Biography" => Self::Biography,
55 "Comedy" => Self::Comedy,
56 "Crime" => Self::Crime,
57 "Documentary" => Self::Documentary,
58 "Drama" => Self::Drama,
59 "Experimental" => Self::Experimental,
60 "Family" => Self::Family,
61 "Fantasy" => Self::Fantasy,
62 "Film-Noir" => Self::FilmNoir,
63 "Game-Show" => Self::GameShow,
64 "History" => Self::History,
65 "Horror" => Self::Horror,
66 "Music" => Self::Music,
67 "Musical" => Self::Musical,
68 "Mystery" => Self::Mystery,
69 "News" => Self::News,
70 "Reality-TV" => Self::RealityTv,
71 "Romance" => Self::Romance,
72 "Sci-Fi" => Self::SciFi,
73 "Short" => Self::Short,
74 "Sport" => Self::Sport,
75 "Talk-Show" => Self::TalkShow,
76 "Thriller" => Self::Thriller,
77 "War" => Self::War,
78 "Western" => Self::Western,
79 s => return Err(crate::Error::InvalidGenre(s.into()))
80 })
81 }
82}
83
84#[inline]
85pub(crate) fn deserialize<'de, D: Deserializer<'de>>(deserializer: D) -> Result<ArrayVec<Genre, 3>, D::Error> {
86 let input: &str = Deserialize::deserialize(deserializer)?;
87 if(input == "\\N") {
88 return Ok(ArrayVec::new());
89 }
90 match input.split(',').map(Genre::from_str).collect::<Result<ArrayVec<_, 3>, crate::Error>>() {
91 Ok(v) => Ok(v),
92 Err(_) => Err(serde::de::Error::invalid_value(
93 Unexpected::Str(input),
94 &"'Action', 'Adult', 'Adventure', 'Animation', 'Biography', 'Comedy', 'Crime', 'Documentary', 'Drama', 'Family', 'Fantasy', 'Film-Noir', 'GameShow', 'History', 'Horror', 'Music', 'Musical', 'Mystery', 'News', 'Reality-TV', 'Romance', 'Sci-Fi', 'Short', 'Sport', 'Talk-Show', 'Thriller', 'War', 'Western'"
95 ))
96 }
97}
98