1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
// -----------------------------------------------------------------------------------------------------------------------------------------
// Rust-Lang Libs/Eventure 2024
// -----------------------------------------------------------------------------------------------------------------------------------------
//! Core abstractions shared amongst different implementations/integrations.
use Any;
use Display;
use *;
// -----------------------------------------------------------------------------------------------------------------------------------------
// Public traits
// -----------------------------------------------------------------------------------------------------------------------------------------
/// Base event abstraction. It should be implemented for each event.
///
/// # Examples
///
/// ```
/// use std::any::Any;
/// use std::fmt::{Display, Formatter};
/// use serde::{Deserialize, Serialize, Serializer};
/// use eventure::model;
///
/// #[derive(Serialize, Deserialize)]
/// pub struct OrderCreated {
/// event_id: String,
/// customer_id: String,
/// }
///
/// impl Display for OrderCreated {
/// fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
/// write!(f, "{} event with id {}",
/// "OrderCreated", self.event_id)
/// }
/// }
///
/// #[typetag::serde]
/// impl model::Event for OrderCreated {
/// fn id(&self) -> &str {
/// &self.event_id[..]
/// }
/// fn name(&self) -> &str {
/// "OrderCreated"
/// }
/// fn as_any(&self) -> &dyn Any {
/// self
/// }
/// fn to_json(&self) -> String {
/// let event = self as &dyn model::Event;
/// serde_json::to_string(&event).unwrap()
/// }
/// }
/// ```
mopafy!;
/// Base event handler abstraction. It should be implemented for each event handler.
/// # Examples
///
/// ```
/// use std::fmt::{Display, Formatter};
/// use log::info;
/// use eventure::model;
///
/// struct OrderCreatedEventHandler {
/// id: String
///}
///
/// struct OrderCreated {
/// event_id: String,
/// customer_id: String,
/// }
///
/// impl Display for OrderCreated {
/// fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
/// write!(f, "{} event, id {}", "OrderCreated", self.event_id)
/// }
/// }
///
/// impl Display for OrderCreatedEventHandler {
/// fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
/// write!(f, "{}", "OrderEventHandler")
/// }
/// }
///
/// impl model::EventHandler for OrderCreatedEventHandler {
/// fn handle(&self, event: &(dyn model::Event + '_)) {
/// match event.as_any().downcast_ref::<OrderCreated>() {
/// Some(order_create) => self.handle(order_create),
/// None => info!(target: "OrderCreatedEventHandler", "not handling {}", event)
/// }
/// }
///
/// fn id(&self) -> String {
/// String::from(&self.id)
/// }
/// }
///
/// impl OrderCreatedEventHandler {
/// fn handle(&self, event: &OrderCreated) {
/// info!(target: "OrderCreatedEventHandler", "handling {}", event)
/// }
/// }
/// ```