1use thiserror::Error;
2
3#[derive(Error, Debug)]
4pub enum Error {
5 #[error("I/O error: {0}")]
6 IO(#[from] std::io::Error),
7 #[error("invalid note: {0}")]
8 Note(#[from] NoteError),
9 #[error("invalid chord: {0}")]
10 Chord(#[from] ChordError),
11 #[error("invalid score: {0}")]
12 Score(#[from] ScoreError),
13 #[error("error converting to MIDI: {0}")]
14 ToMidiConversion(#[from] ToMidiConversionError),
15}
16
17#[derive(Error, Debug, PartialEq)]
18pub enum NoteError {
19 #[error("invalid pitch: {0}")]
20 InvalidPitch(u32),
21 #[error("invalid rhythm: {0}")]
22 InvalidRhythm(f64),
23}
24
25#[derive(Error, Debug, PartialEq)]
26pub enum ChordError {
27 #[error("chord contains 0 note")]
28 EmptyChord,
29 #[error("rhythm value is longer than its notes, use a rest")]
30 RhythmTooLong,
31}
32
33#[derive(Error, Debug, PartialEq)]
34pub enum ScoreError {
35 #[error("tempo cannot be 0")]
36 InvalidTempo,
37}
38
39#[derive(Error, Debug, PartialEq)]
40pub enum ToMidiConversionError {
41 #[error("too many parts (16 max): {0}")]
42 TooManyParts(usize),
43}