rtc_hal/
error.rs

1//! # RTC Error Types and Classification
2//!
3//! This module provides a standardized error handling framework for RTC drivers,
4//! allowing consistent error categorization across different RTC hardware implementations.
5
6/// Common categories of errors for RTC drivers
7#[derive(Debug, Clone, Copy, PartialEq, Eq)]
8pub enum ErrorKind {
9    // Errors related to core traits
10    /// Underlying bus error (I2C, SPI, etc.)
11    Bus,
12    /// Invalid date/time value provided
13    InvalidDateTime,
14
15    // Errors related to extended
16    /// Invalid alarm configuration
17    InvalidAlarmConfig,
18    /// The specified square wave frequency is not supported by the RTC
19    UnsupportedSqwFrequency,
20    /// Invalid register address
21    InvalidAddress,
22    /// NVRAM address out of bounds
23    NvramOutOfBounds,
24    /// NVRAM is write protected
25    NvramWriteProtected,
26
27    /// Any other error not covered above
28    Other,
29}
30
31/// Trait that RTC driver error types should implement
32pub trait RtcError {
33    /// Map a driver-specific error into a general category
34    fn kind(&self) -> ErrorKind;
35}
36
37#[cfg(test)]
38mod tests {
39    use super::*;
40
41    // Mock error type for testing
42    #[derive(Debug, Clone, Copy, PartialEq, Eq)]
43    enum MockRtcError {
44        I2cError,
45        InvalidDateTime,
46        InvalidAlarmTime,
47        UnsupportedSqwFrequency,
48        InvalidRegisterAddress,
49        NvramAddressOutOfBounds,
50        NvramWriteProtected,
51        UnknownError,
52    }
53
54    impl RtcError for MockRtcError {
55        fn kind(&self) -> ErrorKind {
56            match self {
57                MockRtcError::I2cError => ErrorKind::Bus,
58                MockRtcError::InvalidDateTime => ErrorKind::InvalidDateTime,
59                MockRtcError::InvalidAlarmTime => ErrorKind::InvalidAlarmConfig,
60                MockRtcError::UnsupportedSqwFrequency => ErrorKind::UnsupportedSqwFrequency,
61                MockRtcError::InvalidRegisterAddress => ErrorKind::InvalidAddress,
62                MockRtcError::NvramAddressOutOfBounds => ErrorKind::NvramOutOfBounds,
63                MockRtcError::NvramWriteProtected => ErrorKind::NvramWriteProtected,
64                MockRtcError::UnknownError => ErrorKind::Other,
65            }
66        }
67    }
68
69    #[test]
70    fn test_error_kind_mapping() {
71        assert_eq!(MockRtcError::I2cError.kind(), ErrorKind::Bus);
72        assert_eq!(
73            MockRtcError::InvalidDateTime.kind(),
74            ErrorKind::InvalidDateTime
75        );
76        assert_eq!(
77            MockRtcError::InvalidAlarmTime.kind(),
78            ErrorKind::InvalidAlarmConfig
79        );
80        assert_eq!(
81            MockRtcError::UnsupportedSqwFrequency.kind(),
82            ErrorKind::UnsupportedSqwFrequency
83        );
84        assert_eq!(
85            MockRtcError::InvalidRegisterAddress.kind(),
86            ErrorKind::InvalidAddress
87        );
88        assert_eq!(
89            MockRtcError::NvramAddressOutOfBounds.kind(),
90            ErrorKind::NvramOutOfBounds
91        );
92        assert_eq!(
93            MockRtcError::NvramWriteProtected.kind(),
94            ErrorKind::NvramWriteProtected
95        );
96        assert_eq!(MockRtcError::UnknownError.kind(), ErrorKind::Other);
97    }
98
99    #[test]
100    fn test_error_kind_equality() {
101        assert_eq!(ErrorKind::Bus, ErrorKind::Bus);
102        assert_ne!(ErrorKind::Bus, ErrorKind::InvalidDateTime);
103        assert_ne!(
104            ErrorKind::InvalidAlarmConfig,
105            ErrorKind::UnsupportedSqwFrequency
106        );
107        assert_ne!(ErrorKind::NvramOutOfBounds, ErrorKind::NvramWriteProtected);
108    }
109}