1use thiserror::Error;
4
5#[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 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}