1use std::any::Any;
6
7pub trait EventHandler: Send + Sync {
12 fn ev_start(&mut self, _worker: &dyn Any) {}
14
15 fn ev_pickup(&mut self, _worker: &dyn Any, _node: &str) {}
22
23 fn ev_read(&mut self, _worker: &dyn Any, _node: &str, _sname: &str, _msg: &str) {}
26
27 fn ev_error(&mut self, _worker: &dyn Any) {}
32
33 fn ev_written(&mut self, _worker: &dyn Any, _node: &str, _sname: &str, _size: usize) {}
36
37 fn ev_hup(&mut self, _worker: &dyn Any, _node: &str, _rc: i32) {}
40
41 fn ev_close(&mut self, _worker: &dyn Any, _timedout: bool) {}
43
44 fn _ev_routing(&mut self, _worker: &dyn Any, _arg: &str) {}
47
48 fn ev_msg(&mut self, _port: u16, _msg: &str) {}
50
51 fn ev_timer(&mut self, _timer: &dyn Any) {}
53}
54
55#[cfg(test)]
56mod tests {
57 use super::*;
58
59 #[test]
61 fn test_default_impls_callable() {
62 struct DefaultHandler;
63
64 impl EventHandler for DefaultHandler {}
65
66 let mut handler = DefaultHandler;
67
68 handler.ev_start(&dyn_any_placeholder());
70 handler.ev_pickup(&dyn_any_placeholder(), "node1");
71 handler.ev_read(&dyn_any_placeholder(), "node1", "stdout", "hello");
72 handler.ev_error(&dyn_any_placeholder());
73 handler.ev_written(&dyn_any_placeholder(), "node1", "stdout", 100);
74 handler.ev_hup(&dyn_any_placeholder(), "node1", 0);
75 handler.ev_close(&dyn_any_placeholder(), false);
76 handler._ev_routing(&dyn_any_placeholder(), "route_data");
77 handler.ev_msg(8080, "message");
78 handler.ev_timer(&dyn_any_placeholder());
79 }
80
81 #[test]
83 fn test_custom_overrides() {
84 struct CustomHandler {
85 pub start_count: usize,
86 pub close_count: usize,
87 }
88
89 impl CustomHandler {
90 fn new() -> Self {
91 Self {
92 start_count: 0,
93 close_count: 0,
94 }
95 }
96 }
97
98 impl EventHandler for CustomHandler {
99 fn ev_start(&mut self, _worker: &dyn Any) {
100 self.start_count += 1;
101 }
102
103 fn ev_close(&mut self, _worker: &dyn Any, timedout: bool) {
104 self.close_count += 1;
105 assert!(!timedout, "Expected no timeout in this test");
106 }
107 }
108
109 let mut handler = CustomHandler::new();
110
111 handler.ev_start(&dyn_any_placeholder());
112 handler.ev_start(&dyn_any_placeholder());
113 handler.ev_close(&dyn_any_placeholder(), false);
114
115 assert_eq!(handler.start_count, 2, "ev_start should be called twice");
116 assert_eq!(handler.close_count, 1, "ev_close should be called once");
117 }
118
119 #[test]
126 fn test_object_safety() {
127 struct Handler1 {
128 pub count: usize,
129 }
130
131 impl EventHandler for Handler1 {
132 fn ev_start(&mut self, _worker: &dyn Any) {
133 self.count += 1;
134 }
135 }
136
137 struct Handler2 {
138 pub messages: Vec<String>,
139 }
140
141 impl EventHandler for Handler2 {
142 fn ev_read(&mut self, _worker: &dyn Any, node: &str, sname: &str, msg: &str) {
143 self.messages.push(format!("{}:{}:{}", node, sname, msg));
144 }
145 }
146
147 let mut handlers: Vec<Box<dyn EventHandler>> = Vec::new();
150 handlers.push(Box::new(Handler1 { count: 0 }));
151 handlers.push(Box::new(Handler2 {
152 messages: Vec::new(),
153 }));
154
155 for handler in &mut handlers {
157 handler.ev_start(&dyn_any_placeholder());
158 }
159
160 for handler in &mut handlers {
162 handler.ev_read(&dyn_any_placeholder(), "node1", "stdout", "test");
163 }
164
165 assert!(
169 true,
170 "Object safety test passed - Box<dyn EventHandler> works"
171 );
172 }
173
174 fn dyn_any_placeholder() -> Box<dyn Any> {
176 Box::new(())
177 }
178
179 #[test]
181 fn test_send_sync() {
182 struct SendSyncHandler;
183
184 impl EventHandler for SendSyncHandler {}
185
186 fn assert_send<T: Send>() {}
187 fn assert_sync<T: Sync>() {}
188
189 assert_send::<Box<dyn EventHandler>>();
190 assert_sync::<Box<dyn EventHandler>>();
191 assert_send::<SendSyncHandler>();
192 assert_sync::<SendSyncHandler>();
193 }
194}