1use thiserror::Error;
4
5#[derive(Error, Debug)]
7pub enum Error {
8 #[error("invalid record type: {0}")]
10 InvalidRecordType(String),
11
12 #[error("failed to parse field '{field}': {message}")]
14 ParseField {
15 field: &'static str,
16 message: String,
17 },
18
19 #[error("invalid date format: {0}")]
21 InvalidDate(String),
22
23 #[error("invalid {enum_type} value: {value}")]
25 InvalidEnumValue {
26 enum_type: &'static str,
27 value: String,
28 },
29
30 #[error("missing required field: {0}")]
32 MissingField(&'static str),
33
34 #[error("expected {expected} fields, got {actual} for record type {record_type}")]
36 FieldCountMismatch {
37 record_type: String,
38 expected: usize,
39 actual: usize,
40 },
41}
42
43pub type Result<T> = std::result::Result<T, Error>;
45
46#[cfg(test)]
47mod tests {
48 use super::*;
49
50 #[test]
51 fn test_error_display() {
52 let err = Error::InvalidRecordType("XX".to_string());
53 assert_eq!(err.to_string(), "invalid record type: XX");
54
55 let err = Error::ParseField {
56 field: "frequency",
57 message: "not a number".to_string(),
58 };
59 assert_eq!(
60 err.to_string(),
61 "failed to parse field 'frequency': not a number"
62 );
63
64 let err = Error::InvalidDate("2024-13-45".to_string());
65 assert_eq!(err.to_string(), "invalid date format: 2024-13-45");
66
67 let err = Error::InvalidEnumValue {
68 enum_type: "RadioService",
69 value: "ZZ".to_string(),
70 };
71 assert_eq!(err.to_string(), "invalid RadioService value: ZZ");
72
73 let err = Error::MissingField("call_sign");
74 assert_eq!(err.to_string(), "missing required field: call_sign");
75
76 let err = Error::FieldCountMismatch {
77 record_type: "HD".to_string(),
78 expected: 60,
79 actual: 55,
80 };
81 assert_eq!(
82 err.to_string(),
83 "expected 60 fields, got 55 for record type HD"
84 );
85 }
86}