1use crate::prelude::OutBox;
19use downcast_rs::{impl_downcast, Downcast};
20use std::fmt::Debug;
21
22pub trait TEvent: Sync + Send + Downcast {
23 fn externally_notifiable(&self) -> bool {
24 false
25 }
26 fn internally_notifiable(&self) -> bool {
27 false
28 }
29
30 fn metadata(&self) -> EventMetadata {
31 let event_name = std::any::type_name::<Self>().split("::").last().unwrap();
32 EventMetadata {
33 aggregate_id: Default::default(),
34 aggregate_name: Default::default(),
35 topic: event_name.to_string(),
36 }
37 }
38 fn outbox(&self) -> OutBox {
39 let metadata = self.metadata();
40 OutBox::new(metadata.aggregate_id, metadata.aggregate_name, metadata.topic, self.state())
41 }
42
43 fn state(&self) -> String;
44}
45
46impl_downcast!(TEvent);
47impl Debug for dyn TEvent {
48 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
49 write!(f, "{}", self.metadata().topic)
50 }
51}
52
53#[derive(Debug)]
54pub struct EventMetadata {
55 pub aggregate_id: String,
56 pub aggregate_name: String,
57 pub topic: String,
58}
59
60pub trait TCommand: 'static + Send + Sync + Debug {}