1use std::convert::From;
2use std::default::Default;
3use std::fmt;
4
5#[derive(Copy, Clone, Debug, Eq, PartialEq)]
6pub enum Error {
7 FileError,
8 NotMP3,
9 NoHeader,
10 DuplicatedIDV3,
11 InvalidData,
12}
13
14impl fmt::Display for Error {
15 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
16 let err = match *self {
17 Error::FileError => "An I/O error occurred",
18 Error::NotMP3 => "The file is not a valid MP3 file",
19 Error::NoHeader => "The file is missing an MP3 header",
20 Error::DuplicatedIDV3 => "The MP3 file contains a duplicate IDv3 frame",
21 Error::InvalidData => "The MP3 metadata is invalid",
22 };
23 err.fmt(f)
24 }
25}
26
27#[allow(non_camel_case_types)]
28#[derive(Copy, Clone, Debug, Eq, PartialEq)]
29pub enum Version {
30 Reserved,
31 MPEG1,
32 MPEG2,
33 MPEG2_5,
34 Unknown,
35}
36
37impl Default for Version {
38 fn default() -> Version {
39 Version::Unknown
40 }
41}
42
43impl From<u32> for Version {
44 fn from(c: u32) -> Version {
45 match c {
46 0x00 => Version::MPEG2_5,
47 0x01 => Version::Reserved,
48 0x02 => Version::MPEG2,
49 0x03 => Version::MPEG1,
50 _ => unreachable!(),
51 }
52 }
53}
54
55#[derive(Copy, Clone, Debug, Eq, PartialEq)]
56pub enum Layer {
57 Reserved,
58 Layer1,
59 Layer2,
60 Layer3,
61 Unknown,
62}
63
64impl Default for Layer {
65 fn default() -> Layer {
66 Layer::Unknown
67 }
68}
69
70impl From<u32> for Layer {
71 fn from(c: u32) -> Layer {
72 match c {
73 0x0 => Layer::Reserved,
74 0x1 => Layer::Layer3,
75 0x2 => Layer::Layer2,
76 0x3 => Layer::Layer1,
77 _ => unreachable!(),
78 }
79 }
80}
81
82#[derive(Copy, Clone, Debug, Eq, PartialEq)]
83pub enum CRC {
84 Added,
86 NotAdded,
88}
89
90impl Default for CRC {
91 fn default() -> CRC {
92 CRC::NotAdded
93 }
94}
95
96impl From<u32> for CRC {
97 fn from(c: u32) -> CRC {
98 match c {
99 0x00 => CRC::Added,
100 0x01 => CRC::NotAdded,
101 _ => unreachable!(),
102 }
103 }
104}
105
106#[derive(Copy, Clone, Debug, Eq, PartialEq)]
107pub enum ChannelType {
108 Stereo,
109 JointStereo,
110 DualChannel,
111 SingleChannel,
112 Unknown,
113}
114
115impl Default for ChannelType {
116 fn default() -> ChannelType {
117 ChannelType::Unknown
118 }
119}
120
121impl From<u32> for ChannelType {
122 fn from(c: u32) -> ChannelType {
123 match c {
124 0x0 => ChannelType::Stereo,
125 0x1 => ChannelType::JointStereo,
126 0x2 => ChannelType::DualChannel,
127 0x3 => ChannelType::SingleChannel,
128 _ => unreachable!(),
129 }
130 }
131}
132
133#[derive(Copy, Clone, Debug, Eq, PartialEq)]
134pub enum Copyright {
135 None,
136 Some,
137}
138
139impl Default for Copyright {
140 fn default() -> Copyright {
141 Copyright::Some
142 }
143}
144
145impl From<u32> for Copyright {
146 fn from(c: u32) -> Copyright {
147 match c {
148 0x0 => Copyright::None,
149 0x1 => Copyright::Some,
150 _ => unreachable!(),
151 }
152 }
153}
154
155#[derive(Copy, Clone, Debug, Eq, PartialEq)]
156pub enum Status {
157 Copy,
158 Original,
159 Unknown,
160}
161
162impl Default for Status {
163 fn default() -> Status {
164 Status::Unknown
165 }
166}
167
168impl From<u32> for Status {
169 fn from(c: u32) -> Status {
170 match c {
171 0x0 => Status::Copy,
172 0x1 => Status::Original,
173 _ => unreachable!(),
174 }
175 }
176}
177
178#[derive(Copy, Clone, Debug, Eq, PartialEq)]
179pub enum Emphasis {
180 None,
182 MicroSeconds,
184 Reserved,
186 CCITT,
188 Unknown,
189}
190
191impl Default for Emphasis {
192 fn default() -> Emphasis {
193 Emphasis::Unknown
194 }
195}
196
197impl From<u32> for Emphasis {
198 fn from(c: u32) -> Emphasis {
199 match c {
200 0x0 => Emphasis::None,
201 0x1 => Emphasis::MicroSeconds,
202 0x2 => Emphasis::Reserved,
203 0x3 => Emphasis::CCITT,
204 _ => unreachable!(),
205 }
206 }
207}
208
209#[derive(Clone, Debug, Eq, PartialEq)]
210pub enum Genre {
211 Blues,
212 ClassicRock,
213 Country,
214 Dance,
215 Disco,
216 Funk,
217 Grunge,
218 HipHop,
219 Jazz,
220 Metal,
221 NewAge,
222 Oldies,
223 Other,
224 Pop,
225 RAndB,
226 Rap,
227 Reggae,
228 Rock,
229 Techno,
230 Industrial,
231 Alternative,
232 Ska,
233 DeathMetal,
234 Pranks,
235 Soundtrack,
236 EuroTechno,
237 Ambient,
238 TripHop,
239 Vocal,
240 JazzFunk,
241 Fusion,
242 Trance,
243 Classical,
244 Instrumental,
245 Acid,
246 House,
247 Game,
248 SoundClip,
249 Gospel,
250 Noise,
251 AlternRock,
252 Bass,
253 Soul,
254 Punk,
255 Space,
256 Meditative,
257 InstrumentalPop,
258 InstrumentalRock,
259 Ethnic,
260 Gothic,
261 Darkwave,
262 TechnoIndustrial,
263 Electronic,
264 PopFolk,
265 Eurodance,
266 Dream,
267 SouthernRock,
268 Comedy,
269 Cult,
270 Gangsta,
271 Top40,
272 ChristianRap,
273 PopFunk,
274 Jungle,
275 NativeAmerican,
276 Cabaret,
277 NewWave,
278 Psychadelic,
279 Rave,
280 Showtunes,
281 Trailer,
282 LoFi,
283 Tribal,
284 AcidPunk,
285 AcidJazz,
286 Polka,
287 Retro,
288 Musical,
289 RockAndRoll,
290 HardRock,
291 Folk,
293 FolkRock,
294 NationalFolk,
295 Swing,
296 FastFusion,
297 Bebob,
298 Latin,
299 Revival,
300 Celtic,
301 Bluegrass,
302 Avantgarde,
303 GothicRock,
304 ProgressiveRock,
305 PsychedelicRock,
306 SymphonicRock,
307 SlowRock,
308 BigBand,
309 Chorus,
310 EasyListening,
311 Acoustic,
312 Humour,
313 Speech,
314 Chanson,
315 Opera,
316 ChamberMusic,
317 Sonata,
318 Symphony,
319 BootyBrass,
320 Primus,
321 PornGroove,
322 Satire,
323 SlowJam,
324 Club,
325 Tango,
326 Samba,
327 Folklore,
328 Ballad,
329 PowerBallad,
330 RhytmicSoul,
331 Freestyle,
332 Duet,
333 PunkRock,
334 DrumSolo,
335 ACapela,
336 EuroHouse,
337 DanceHall,
338 Something(String),
339 Unknown,
340}
341
342impl Default for Genre {
343 fn default() -> Genre {
344 Genre::Unknown
345 }
346}
347
348impl<'a> From<&'a str> for Genre {
349 fn from(c: &'a str) -> Genre {
350 match c.parse::<u8>() {
351 Ok(nb) => Genre::from(nb),
352 Err(_) => Genre::Something(c.to_owned()),
353 }
354 }
355}
356
357impl From<u8> for Genre {
358 fn from(c: u8) -> Genre {
359 match c {
360 0 => Genre::Blues,
361 1 => Genre::ClassicRock,
362 2 => Genre::Country,
363 3 => Genre::Dance,
364 4 => Genre::Disco,
365 5 => Genre::Funk,
366 6 => Genre::Grunge,
367 7 => Genre::HipHop,
368 8 => Genre::Jazz,
369 9 => Genre::Metal,
370 10 => Genre::NewAge,
371 11 => Genre::Oldies,
372 12 => Genre::Other,
373 13 => Genre::Pop,
374 14 => Genre::RAndB,
375 15 => Genre::Rap,
376 16 => Genre::Reggae,
377 17 => Genre::Rock,
378 18 => Genre::Techno,
379 19 => Genre::Industrial,
380 20 => Genre::Alternative,
381 21 => Genre::Ska,
382 22 => Genre::DeathMetal,
383 23 => Genre::Pranks,
384 24 => Genre::Soundtrack,
385 25 => Genre::EuroTechno,
386 26 => Genre::Ambient,
387 27 => Genre::TripHop,
388 28 => Genre::Vocal,
389 29 => Genre::JazzFunk,
390 30 => Genre::Fusion,
391 31 => Genre::Trance,
392 32 => Genre::Classical,
393 33 => Genre::Instrumental,
394 34 => Genre::Acid,
395 35 => Genre::House,
396 36 => Genre::Game,
397 37 => Genre::SoundClip,
398 38 => Genre::Gospel,
399 39 => Genre::Noise,
400 40 => Genre::AlternRock,
401 41 => Genre::Bass,
402 42 => Genre::Soul,
403 43 => Genre::Punk,
404 44 => Genre::Space,
405 45 => Genre::Meditative,
406 46 => Genre::InstrumentalPop,
407 47 => Genre::InstrumentalRock,
408 48 => Genre::Ethnic,
409 49 => Genre::Gothic,
410 50 => Genre::Darkwave,
411 51 => Genre::TechnoIndustrial,
412 52 => Genre::Electronic,
413 53 => Genre::PopFolk,
414 54 => Genre::Eurodance,
415 55 => Genre::Dream,
416 56 => Genre::SouthernRock,
417 57 => Genre::Comedy,
418 58 => Genre::Cult,
419 59 => Genre::Gangsta,
420 60 => Genre::Top40,
421 61 => Genre::ChristianRap,
422 62 => Genre::PopFunk,
423 63 => Genre::Jungle,
424 64 => Genre::NativeAmerican,
425 65 => Genre::Cabaret,
426 66 => Genre::NewWave,
427 67 => Genre::Psychadelic,
428 68 => Genre::Rave,
429 69 => Genre::Showtunes,
430 70 => Genre::Trailer,
431 71 => Genre::LoFi,
432 72 => Genre::Tribal,
433 73 => Genre::AcidPunk,
434 74 => Genre::AcidJazz,
435 75 => Genre::Polka,
436 76 => Genre::Retro,
437 77 => Genre::Musical,
438 78 => Genre::RockAndRoll,
439 79 => Genre::HardRock,
440 80 => Genre::Folk,
441 81 => Genre::FolkRock,
442 82 => Genre::NationalFolk,
443 83 => Genre::Swing,
444 84 => Genre::FastFusion,
445 85 => Genre::Bebob,
446 86 => Genre::Latin,
447 87 => Genre::Revival,
448 88 => Genre::Celtic,
449 89 => Genre::Bluegrass,
450 90 => Genre::Avantgarde,
451 91 => Genre::GothicRock,
452 92 => Genre::ProgressiveRock,
453 93 => Genre::PsychedelicRock,
454 94 => Genre::SymphonicRock,
455 95 => Genre::SlowRock,
456 96 => Genre::BigBand,
457 97 => Genre::Chorus,
458 98 => Genre::EasyListening,
459 99 => Genre::Acoustic,
460 100 => Genre::Humour,
461 101 => Genre::Speech,
462 102 => Genre::Chanson,
463 103 => Genre::Opera,
464 104 => Genre::ChamberMusic,
465 105 => Genre::Sonata,
466 106 => Genre::Symphony,
467 107 => Genre::BootyBrass,
468 108 => Genre::Primus,
469 109 => Genre::PornGroove,
470 110 => Genre::Satire,
471 111 => Genre::SlowJam,
472 112 => Genre::Club,
473 113 => Genre::Tango,
474 114 => Genre::Samba,
475 115 => Genre::Folklore,
476 116 => Genre::Ballad,
477 117 => Genre::PowerBallad,
478 118 => Genre::RhytmicSoul,
479 119 => Genre::Freestyle,
480 120 => Genre::Duet,
481 121 => Genre::PunkRock,
482 122 => Genre::DrumSolo,
483 123 => Genre::ACapela,
484 124 => Genre::EuroHouse,
485 125 => Genre::DanceHall,
486 _ => Genre::Unknown,
487 }
488 }
489}
490
491impl fmt::Display for Genre {
492 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
493 match self {
494 Self::Something(s) => write!(f, "{}", s),
495 _ => fmt::Debug::fmt(self, f),
496 }
497 }
498}
499
500#[cfg(test)]
501mod tests {
502 use super::*;
503 #[test]
504 fn fmt_genre() {
505 assert_eq!(Genre::Club.to_string(), "Club");
506 assert_eq!(Genre::Something("Foo".to_string()).to_string(), "Foo");
507 }
508}