Skip to main content

midi_toolkit/io/
errors.rs

1use thiserror::Error;
2
3#[derive(Debug)]
4pub enum MIDILoadError {
5    CorruptChunks,
6    FilesystemError(std::io::Error),
7    FileTooBig,
8}
9
10impl From<std::io::Error> for MIDILoadError {
11    fn from(e: std::io::Error) -> Self {
12        MIDILoadError::FilesystemError(e)
13    }
14}
15
16#[derive(Debug, Error)]
17pub enum MIDIParseError {
18    CorruptEvent {
19        track_number: Option<u32>,
20        position: u64,
21    },
22    UnexpectedTrackEnd {
23        track_number: Option<u32>,
24        track_start: u64,
25        expected_track_end: u64,
26        found_track_end: u64,
27    },
28    FilesystemError(#[from] std::io::Error),
29}
30
31impl std::fmt::Display for MIDIParseError {
32    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
33        match self {
34            MIDIParseError::CorruptEvent {
35                track_number,
36                position,
37            } => match track_number {
38                Some(track_number) => write!(
39                    f,
40                    "Corrupt event (track {track_number}, position: {position:#06x})",
41                ),
42                None => write!(f, "Corrupt event (position: {position:#06x})", ),
43            },
44            MIDIParseError::UnexpectedTrackEnd {
45                track_number,
46                track_start,
47                expected_track_end,
48                found_track_end,
49            } => match track_number {
50                Some(track_number) => write!(f, "Unexpected track end (track {track_number}, track start: {track_start:#06x}, expected end: {expected_track_end:#06x}, found end: {found_track_end:#06x})"),
51                None => write!(f, "Unexpected track end (track start: {track_start:#06x}, expected end: {expected_track_end:#06x}, found end: {found_track_end:#06x})")
52            },
53            MIDIParseError::FilesystemError(e) => write!(f, "Filesystem error: {e}"),
54        }
55    }
56}
57
58#[derive(Debug, Error)]
59pub enum MIDIWriteError {
60    #[error("Filesystem error: {0}")]
61    FilesystemError(#[from] std::io::Error),
62    #[error("MIDI writer has already been ended")]
63    WriterEnded,
64    #[error("Track {track_id} has already been opened")]
65    TrackAlreadyOpened { track_id: i32 },
66    #[error("Track {track_id} has already been ended")]
67    TrackAlreadyEnded { track_id: i32 },
68    #[error("Cannot end MIDI writer while tracks are still open: {track_ids:?}")]
69    OpenTracksRemaining { track_ids: Vec<i32> },
70    #[error("Cannot end MIDI writer while there are unopened track gaps: {track_ids:?}")]
71    TrackGapsRemaining { track_ids: Vec<i32> },
72    #[error("MIDI writer track count {track_count} exceeds the SMF limit of 65535")]
73    TrackCountOverflow { track_count: usize },
74}