old school music tracker audio backend
at main 50 lines 1.3 kB view raw
1use std::error::Error; 2use std::fmt::{Display, Formatter}; 3use std::io; 4 5#[derive(Debug)] 6pub enum LoadErr { 7 CantReadFile, 8 Invalid, 9 BufferTooShort, 10 /// A defect handler function returned ControlFlow::Break 11 Cancelled, 12 IO(io::Error), 13} 14 15impl From<io::Error> for LoadErr { 16 fn from(err: io::Error) -> Self { 17 if err.kind() == io::ErrorKind::UnexpectedEof { 18 Self::BufferTooShort 19 } else { 20 Self::IO(err) 21 } 22 } 23} 24 25impl Display for LoadErr { 26 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { 27 write!(f, "{self:?}") 28 } 29} 30 31impl Error for LoadErr {} 32 33/// TODO: https://users.rust-lang.org/t/validation-monad/117894/6 34/// 35/// this is a way cleaner and nicer approach. Provice a lot of data about the Error, like position in file, expected value, received value, ... 36/// maybe even allow to cancel the parsing via ControlFlow<(), ()> 37/// 38/// load was partially successful. These are the defects that are in the now loaded project 39#[derive(Debug, Clone, Copy)] 40#[non_exhaustive] 41pub enum LoadDefect { 42 /// deletes the effect 43 UnknownEffect, 44 /// replaced with empty text 45 InvalidText, 46 /// tries to replace with a sane default value 47 OutOfBoundsValue, 48 /// skips loading of the pointed to value 49 OutOfBoundsPtr, 50}