Skip to main content

erio_event_bus/
error.rs

1//! Error types for the event bus.
2
3use thiserror::Error;
4
5/// Errors specific to event bus operations.
6#[derive(Debug, Error)]
7pub enum EventBusError {
8    #[error("Source error: {0}")]
9    Source(String),
10
11    #[error("Channel closed")]
12    ChannelClosed,
13}
14
15impl EventBusError {
16    /// Returns `true` if the error is potentially transient.
17    pub fn is_retryable(&self) -> bool {
18        matches!(self, Self::Source(_))
19    }
20}
21
22impl From<EventBusError> for erio_core::CoreError {
23    fn from(err: EventBusError) -> Self {
24        Self::EventBus {
25            message: err.to_string(),
26        }
27    }
28}
29
30#[cfg(test)]
31mod tests {
32    use super::*;
33
34    #[test]
35    fn source_error_displays_message() {
36        let err = EventBusError::Source("notify failed".into());
37        assert_eq!(err.to_string(), "Source error: notify failed");
38    }
39
40    #[test]
41    fn channel_closed_displays_message() {
42        let err = EventBusError::ChannelClosed;
43        assert_eq!(err.to_string(), "Channel closed");
44    }
45
46    #[test]
47    fn source_error_is_retryable() {
48        let err = EventBusError::Source("transient".into());
49        assert!(err.is_retryable());
50    }
51
52    #[test]
53    fn channel_closed_is_not_retryable() {
54        let err = EventBusError::ChannelClosed;
55        assert!(!err.is_retryable());
56    }
57
58    #[test]
59    fn converts_to_core_error() {
60        let err = EventBusError::Source("test".into());
61        let core_err: erio_core::CoreError = err.into();
62        assert!(matches!(core_err, erio_core::CoreError::EventBus { .. }));
63    }
64
65    #[test]
66    fn conversion_preserves_message() {
67        let err = EventBusError::ChannelClosed;
68        let core_err: erio_core::CoreError = err.into();
69        match core_err {
70            erio_core::CoreError::EventBus { message } => {
71                assert_eq!(message, "Channel closed");
72            }
73            _ => panic!("Expected CoreError::EventBus"),
74        }
75    }
76}