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