imdb_async/
genre.rs

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)]
12/// Identifies the genre of a [Title](crate::Title).  Often, a title will have multiple.
13pub 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} // }}}
44
45impl 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