Skip to main content

uls_core/
error.rs

1//! Error types for ULS core operations.
2
3use thiserror::Error;
4
5/// Core ULS error type.
6#[derive(Error, Debug)]
7pub enum Error {
8    /// Invalid record type encountered.
9    #[error("invalid record type: {0}")]
10    InvalidRecordType(String),
11
12    /// Failed to parse a field value.
13    #[error("failed to parse field '{field}': {message}")]
14    ParseField {
15        field: &'static str,
16        message: String,
17    },
18
19    /// Invalid date format.
20    #[error("invalid date format: {0}")]
21    InvalidDate(String),
22
23    /// Invalid enum value.
24    #[error("invalid {enum_type} value: {value}")]
25    InvalidEnumValue {
26        enum_type: &'static str,
27        value: String,
28    },
29
30    /// Missing required field.
31    #[error("missing required field: {0}")]
32    MissingField(&'static str),
33
34    /// Field count mismatch.
35    #[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
43/// Result type alias for ULS core operations.
44pub 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}