1 module eventmanager.demo;
2 
3 import std.exception;
4 import std.stdio;
5 
6 import eventmanager.all;
7 
8 struct AppStartedMeta
9 {
10     string appName;
11 }
12 
13 struct UserCreatedMeta
14 {
15     uint userId;
16     string firstName;
17     string lastName;
18 }
19 
20 class AppStartedEvent : AbstractEvent!AppStartedMeta
21 {
22     this(string appName)
23     {
24         AppStartedMeta meta;
25         meta.appName = appName;
26 
27         super(meta);
28     }
29 }
30 
31 class UserCreatedEvent : AbstractEvent!UserCreatedMeta
32 {
33     this(uint userId, string firstName, string lastName)
34     in {
35         enforce(userId > 0, "UserId must be greater than 0");
36         enforce(firstName != "", "Please supply a valid first Name");
37         enforce(lastName != "", "Please supply a valid last Name");
38     } body {
39         UserCreatedMeta meta;
40         meta.userId = userId;
41         meta.firstName = firstName;
42         meta.lastName = lastName;
43 
44         super(meta);
45     }
46 }
47 
48 class UserUpdatedEvent : AbstractEvent!UserCreatedMeta
49 {
50     this(uint userId, string firstName, string lastName)
51     in {
52         enforce(userId > 0, "UserId must be greater than 0");
53         enforce(firstName != "", "Please supply a valid first Name");
54         enforce(lastName != "", "Please supply a valid last Name");
55     } body {
56         UserCreatedMeta meta;
57         meta.userId = userId;
58         meta.firstName = firstName;
59         meta.lastName = lastName;
60 
61         super(meta);
62     }
63 }
64 
65 class Listener1 : EventListenerInterface
66 {
67     // Listener1 is interested only in the AppStartedEvent, but could be as
68     // many different events as you want.
69     public TypeInfo[] getInterestedEvents() {
70         return [
71             typeid(AppStartedEvent)
72         ];
73     }
74 
75     public EventListInterface handleEvent(EventInterface event, TypeInfo eventType) @trusted {
76         writeln("Listener1 received event: ", event);
77 
78         auto eventList = new EventList();
79 
80         if (eventType == typeid(AppStartedEvent)) {
81             auto meta = event.getMetadata();
82             AppStartedMeta appStartedMeta = *meta.peek!(AppStartedMeta);
83             writeln(appStartedMeta);
84         }
85 
86         return eventList;
87     }
88 }
89 
90 class Listener2 : EventListenerInterface
91 {
92     // Listener2 is interested in the UserCreatedEvent and UserUpdatedEvent events.
93     public TypeInfo[] getInterestedEvents() {
94         return [
95             typeid(UserCreatedEvent),
96             typeid(UserUpdatedEvent)
97         ];
98     }
99 
100     public EventListInterface handleEvent(EventInterface event, TypeInfo eventType) @trusted {
101         writeln("Listener2 received event: ", event);
102 
103         auto eventList = new EventList();
104 
105         if (eventType == typeid(UserCreatedEvent)) {
106             auto meta = event.getMetadata();
107             UserCreatedMeta userCreatedMeta = *meta.peek!(UserCreatedMeta);
108             writeln(userCreatedMeta);
109 
110             // Demonstrate creating another event within an event handler
111             auto UserUpdatedEvent = new UserUpdatedEvent(userCreatedMeta.userId, userCreatedMeta.firstName, userCreatedMeta.lastName);
112             eventList.append(UserUpdatedEvent, typeid(UserUpdatedEvent));
113 
114         } else if (eventType == typeid(UserUpdatedEvent)) {
115             auto meta = event.getMetadata();
116             UserCreatedMeta userCreatedMeta = *meta.peek!(UserCreatedMeta);
117             writeln(userCreatedMeta);
118         }
119 
120         return eventList;
121     }
122 }
123 
124 void beginDemo()
125 {
126     // Create a few test events of different types
127     auto eventAppStarted = new AppStartedEvent("My Test App");
128     auto eventUserCreated = new UserCreatedEvent(1, "Jane", "Doe");
129     
130     // Setup event dispatcher and attach listeners
131     auto dispatcher = new EventDispatcher();
132     dispatcher.attachListener(new Listener1());
133     dispatcher.attachListener(new Listener2());
134 
135     // Setup event list and append our test events.
136     auto eventList = new EventList();
137     eventList.append(eventAppStarted, typeid(AppStartedEvent));
138     eventList.append(eventUserCreated, typeid(UserCreatedEvent));
139 
140     // Dispatch our events - the listeners should receive only the events they
141     // are interested in.
142     eventList.dispatch(dispatcher);
143 
144     // Show the lifecycle of each of the events
145     writeln(eventAppStarted.getLifecycle());
146     writeln(eventUserCreated.getLifecycle());
147 }