Skip to main content

ddd_toolkit_core/domain/
event.rs

1use std::fmt::Debug;
2
3/// Something that happened in the domain, recorded by an
4/// [`crate::domain::AggregateRoot`] and later published through an
5/// [`crate::port::event::EventDispatcher`].
6pub trait DomainEvent: Debug + Send + Sync + 'static {}
7
8#[cfg(test)]
9mod test {
10    use super::*;
11
12    #[derive(Debug)]
13    struct TestEvent;
14
15    impl DomainEvent for TestEvent {}
16
17    #[test]
18    fn test_double_implements_domain_event() {
19        let _event = TestEvent;
20    }
21
22    #[test]
23    fn domain_event_is_dyn_compatible() {
24        let _event: Box<dyn DomainEvent> = Box::new(TestEvent);
25    }
26
27    #[test]
28    fn debug_format_works_via_trait_object() {
29        let event: &dyn DomainEvent = &TestEvent;
30
31        assert_eq!(format!("{event:?}"), "TestEvent");
32    }
33
34    #[test]
35    fn trait_object_is_send_and_sync() {
36        fn assert_send_sync<T: Send + Sync + ?Sized>() {}
37
38        assert_send_sync::<dyn DomainEvent>();
39    }
40
41    #[test]
42    fn test_double_with_fields_implements_domain_event() {
43        #[derive(Debug)]
44        struct TestEventWithFields {
45            id: String,
46        }
47
48        impl DomainEvent for TestEventWithFields {}
49
50        let event = TestEventWithFields {
51            id: "event-1".to_string(),
52        };
53        assert_eq!(event.id, "event-1");
54
55        let event: &dyn DomainEvent = &event;
56        assert_eq!(
57            format!("{event:?}"),
58            r#"TestEventWithFields { id: "event-1" }"#
59        );
60    }
61}