rhythm_open_exchange/
error.rs1use thiserror::Error;
4
5pub type RoxResult<T> = Result<T, RoxError>;
7
8#[derive(Debug, Error)]
10pub enum RoxError {
11 #[error("IO error: {0}")]
12 Io(#[from] std::io::Error),
13
14 #[error("Serialization error: {0}")]
15 Serialize(String),
16
17 #[error("Deserialization error: {0}")]
18 Deserialize(String),
19
20 #[error("Invalid format: {0}")]
21 InvalidFormat(String),
22
23 #[error("Unsupported version: {0}")]
24 UnsupportedVersion(u8),
25
26 #[error("Invalid column index {column} for {key_count}K chart")]
27 InvalidColumn { column: u8, key_count: u8 },
28
29 #[error("Invalid hold duration {duration_us}µs at time {time_us}µs (must be > 0)")]
30 InvalidHoldDuration { time_us: i64, duration_us: i64 },
31
32 #[error("Timing points not sorted by time (found {time_us}µs after {prev_time_us}µs)")]
33 TimingPointsNotSorted { prev_time_us: i64, time_us: i64 },
34
35 #[error("Overlapping notes on column {column} at time {time_us}µs")]
36 OverlappingNotes { column: u8, time_us: i64 },
37
38 #[error("Notes not sorted by time (found {time_us}µs after {prev_time_us}µs)")]
39 NotesNotSorted { prev_time_us: i64, time_us: i64 },
40
41 #[error("No BPM timing point found (at least one is required)")]
42 NoBpmTimingPoint,
43
44 #[error("First BPM timing point at {bpm_time_us}µs is after first note at {note_time_us}µs")]
45 BpmAfterFirstNote { bpm_time_us: i64, note_time_us: i64 },
46
47 #[error("Parse error at line {line}: {message}")]
48 ParseError { line: usize, message: String },
49
50 #[error("Unsupported format: {0}")]
51 UnsupportedFormat(String),
52}