44 lines
1.3 KiB
D
44 lines
1.3 KiB
D
|
module d_webservice_example.business.todo_notification_service;
|
||
|
|
||
|
class TodoNotificationService
|
||
|
{
|
||
|
import d_webservice_example.data.todo_notification : TodoNotification;
|
||
|
import d_webservice_example.enums.todo_notification_type : TodoNotificationType;
|
||
|
import d_webservice_example.mapper.todo_mapper : asTodoTO;
|
||
|
import d_webservice_example.model.todo : Todo;
|
||
|
import std.traits : EnumMembers;
|
||
|
|
||
|
private:
|
||
|
bool[void delegate(scope TodoNotification) @safe] listeners;
|
||
|
|
||
|
public:
|
||
|
this() const nothrow pure @nogc @safe
|
||
|
{
|
||
|
}
|
||
|
|
||
|
void registerListener(scope void delegate(scope const TodoNotification) @safe listener) @safe
|
||
|
{
|
||
|
listeners[listener] = true;
|
||
|
}
|
||
|
|
||
|
void unRegisterListener(scope void delegate(scope const TodoNotification) @safe listener) @safe
|
||
|
{
|
||
|
listeners.remove(listener);
|
||
|
}
|
||
|
|
||
|
static foreach (method; EnumMembers!TodoNotificationType)
|
||
|
{
|
||
|
import std.conv: to;
|
||
|
import std.format : format;
|
||
|
mixin(format!q{
|
||
|
void onTodo%1$sd(const Todo todo) @safe
|
||
|
{
|
||
|
import std.algorithm.iteration : each;
|
||
|
|
||
|
immutable todoChange = TodoNotification(TodoNotificationType.%1$s, todo);
|
||
|
listeners.byKey.each!(listener => listener(todoChange));
|
||
|
}
|
||
|
}(method.to!string));
|
||
|
}
|
||
|
}
|