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