1use std::any::Any;
4use std::sync::Arc;
5
6pub type EventData = Arc<dyn Any + Send + Sync>;
8
9pub struct Event {
11 pub event_type: String,
13 pub data: EventData,
15}
16
17impl Event {
18 pub fn new(event_type: impl Into<String>) -> Self {
20 Self::with_data(event_type, Arc::new(()))
21 }
22
23 pub fn with_data(event_type: impl Into<String>, data: EventData) -> Self {
25 Self {
26 event_type: event_type.into(),
27 data,
28 }
29 }
30}
31
32impl std::fmt::Debug for Event {
33 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
34 f.debug_struct("Event")
35 .field("event_type", &self.event_type)
36 .field("data", &"<Arc<dyn Any>>")
37 .finish()
38 }
39}
40
41#[cfg(test)]
42mod tests {
43 use super::*;
44
45 #[test]
46 fn downcast_works() {
47 let e = Event::with_data("eTick.", Arc::new(42u32));
48 let v = e.data.downcast_ref::<u32>().unwrap();
49 assert_eq!(*v, 42);
50 }
51}