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 }