1#[derive(PartialEq, Debug, Clone, Copy, Eq)]
17pub enum Error {
18 BufferTooShort,
26
27 InvalidEntryType(u8),
35
36 InvalidOptionType(u8),
48
49 InvalidProtocol(u8),
55
56 LengthOverflow,
63
64 ConfigurationError(ConfigError),
69}
70
71#[derive(Debug, Clone, Copy, PartialEq, Eq)]
76pub enum ConfigError {
77 InvalidKey,
85
86 KeyStartsWithEquals,
88
89 UnexpectedEnd,
94
95 LengthOverflow,
100
101 BufferTooSmall,
106
107 InvalidUtf8,
111}
112
113impl From<ConfigError> for Error {
114 fn from(err: ConfigError) -> Self {
115 Error::ConfigurationError(err)
116 }
117}
118
119impl core::fmt::Display for Error {
120 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
121 match self {
122 Error::BufferTooShort => write!(f, "buffer too short for expected structure"),
123 Error::InvalidEntryType(t) => write!(f, "invalid entry type: 0x{:02x}", t),
124 Error::InvalidOptionType(t) => write!(f, "invalid option type: 0x{:02x}", t),
125 Error::InvalidProtocol(p) => write!(f, "invalid transport protocol: 0x{:02x}", p),
126 Error::LengthOverflow => write!(f, "length field overflow"),
127 Error::ConfigurationError(e) => write!(f, "configuration error: {}", e),
128 }
129 }
130}
131
132impl core::fmt::Display for ConfigError {
133 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
134 match self {
135 ConfigError::InvalidKey => write!(f, "invalid key format"),
136 ConfigError::KeyStartsWithEquals => write!(f, "key starts with '='"),
137 ConfigError::UnexpectedEnd => write!(f, "unexpected end of data"),
138 ConfigError::LengthOverflow => write!(f, "length field overflow"),
139 ConfigError::BufferTooSmall => write!(f, "buffer too small"),
140 ConfigError::InvalidUtf8 => write!(f, "invalid UTF-8"),
141 }
142 }
143}
144
145#[cfg(test)]
146mod tests {
147 use super::*;
148
149 #[test]
150 fn test_error_display() {
151 assert_eq!(format!("{}", Error::BufferTooShort), "buffer too short for expected structure");
152 assert_eq!(format!("{}", Error::InvalidEntryType(0xFF)), "invalid entry type: 0xff");
153 assert_eq!(format!("{}", Error::InvalidOptionType(0xAB)), "invalid option type: 0xab");
154 assert_eq!(format!("{}", Error::InvalidProtocol(0x99)), "invalid transport protocol: 0x99");
155 assert_eq!(format!("{}", Error::LengthOverflow), "length field overflow");
156 }
157
158 #[test]
159 fn test_config_error_display() {
160 assert_eq!(format!("{}", ConfigError::InvalidKey), "invalid key format");
161 assert_eq!(format!("{}", ConfigError::KeyStartsWithEquals), "key starts with '='");
162 assert_eq!(format!("{}", ConfigError::UnexpectedEnd), "unexpected end of data");
163 assert_eq!(format!("{}", ConfigError::LengthOverflow), "length field overflow");
164 assert_eq!(format!("{}", ConfigError::BufferTooSmall), "buffer too small");
165 assert_eq!(format!("{}", ConfigError::InvalidUtf8), "invalid UTF-8");
166 }
167
168 #[test]
169 fn test_config_error_conversion() {
170 let config_err = ConfigError::InvalidKey;
171 let err: Error = config_err.into();
172 assert_eq!(err, Error::ConfigurationError(ConfigError::InvalidKey));
173 }
174
175 #[test]
176 fn test_error_equality() {
177 assert_eq!(Error::BufferTooShort, Error::BufferTooShort);
178 assert_ne!(Error::BufferTooShort, Error::LengthOverflow);
179 assert_eq!(Error::InvalidEntryType(0x05), Error::InvalidEntryType(0x05));
180 assert_ne!(Error::InvalidEntryType(0x05), Error::InvalidEntryType(0x06));
181 }
182
183 #[test]
184 fn test_error_clone_copy() {
185 let err = Error::BufferTooShort;
186 let err2 = err;
187 let err3 = err.clone();
188 assert_eq!(err, err2);
189 assert_eq!(err, err3);
190 }
191}