1#[derive(Debug)]
3pub enum IntelHexError {
4 Parse(ParseError),
6 Memory(MemoryError),
8 Io(std::io::Error),
10}
11
12#[derive(Debug)]
14pub enum ParseError {
15 MissingStartCode,
17 RecordTooShort,
19 RecordTooLong,
21 RecordNotEvenLength,
23 InvalidCharacters,
25 ChecksumMismatch(u8, u8),
27 PayloadLengthMismatch,
29 UnsupportedRecordType(u8),
31 InvalidLengthForType,
33 InvalidLoadOffset,
35 MultipleStartAddressRecord,
37}
38
39#[derive(Debug)]
41pub enum MemoryError {
42 AddressOverlap,
44}
45
46impl std::error::Error for IntelHexError {
48 fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
49 match self {
50 IntelHexError::Parse(err) => Some(err),
51 IntelHexError::Memory(err) => Some(err),
52 IntelHexError::Io(err) => Some(err),
53 }
54 }
55}
56
57impl std::error::Error for ParseError {}
58impl std::error::Error for MemoryError {}
59
60impl std::fmt::Display for IntelHexError {
62 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
63 match self {
64 IntelHexError::Parse(err) => write!(f, "Parse error: {}", err),
65 IntelHexError::Memory(err) => write!(f, "Memory error: {}", err),
66 IntelHexError::Io(err) => write!(f, "IO error: {}", err),
67 }
68 }
69}
70
71impl std::fmt::Display for ParseError {
72 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
73 match self {
74 ParseError::MissingStartCode => write!(f, "missing start code ':'"),
75 ParseError::RecordTooShort => write!(f, "record too short"),
76 ParseError::RecordTooLong => write!(f, "record too long"),
77 ParseError::RecordNotEvenLength => {
78 write!(f, "record does not contain a whole number of bytes")
79 }
80 ParseError::InvalidCharacters => write!(f, "invalid characters encountered in record"),
81 ParseError::ChecksumMismatch(found, expected) => {
82 write!(
83 f,
84 "checksum mismatch, found {}, expected {}",
85 found, expected
86 )
87 }
88 ParseError::PayloadLengthMismatch => {
89 write!(f, "payload length does not match record header")
90 }
91 ParseError::UnsupportedRecordType(record_type) => {
92 write!(f, "unsupported record type '{:02X}'", record_type)
93 }
94 ParseError::InvalidLengthForType => write!(f, "payload length invalid for record type"),
95 ParseError::InvalidLoadOffset => write!(f, "invalid load offset"),
96 ParseError::MultipleStartAddressRecord => {
97 write!(f, "multiple start segment/linear address records")
98 }
99 }
100 }
101}
102
103impl std::fmt::Display for MemoryError {
104 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
105 match self {
106 MemoryError::AddressOverlap => write!(
107 f,
108 "address already contains data (overlapping addresses found)"
109 ),
110 }
111 }
112}
113
114impl From<std::io::Error> for IntelHexError {
116 fn from(err: std::io::Error) -> Self {
117 IntelHexError::Io(err)
118 }
119}
120
121impl From<ParseError> for IntelHexError {
122 fn from(err: ParseError) -> Self {
123 IntelHexError::Parse(err)
124 }
125}
126
127impl From<MemoryError> for IntelHexError {
128 fn from(err: MemoryError) -> Self {
129 IntelHexError::Memory(err)
130 }
131}