- Implemented `log(Message message)` which does filtering, transformation and lastly handling
This commit is contained in:
Tristan B. Velloza Kildaire 2024-04-09 08:32:49 +02:00
parent e35f6fba73
commit f6ebb070cc
1 changed files with 38 additions and 4 deletions

View File

@ -10,7 +10,7 @@ public interface Filter
public bool filter(Message message); public bool filter(Message message);
} }
public interface MessageTransform public interface Transform
{ {
public Message transform(Message message); public Message transform(Message message);
} }
@ -36,7 +36,7 @@ import core.sync.mutex : Mutex;
public abstract class Logger public abstract class Logger
{ {
private SList!(MessageTransform) transforms; private SList!(Transform) transforms;
private SList!(Filter) filters; private SList!(Filter) filters;
private SList!(Handler) handlers; private SList!(Handler) handlers;
private Mutex lock; // Lock for attached handlers, filters and transforms private Mutex lock; // Lock for attached handlers, filters and transforms
@ -47,7 +47,7 @@ public abstract class Logger
} }
// TODO: Handle duplicate? // TODO: Handle duplicate?
public final void addTransform(MessageTransform transform) public final void addTransform(Transform transform)
{ {
scope(exit) scope(exit)
{ {
@ -60,7 +60,7 @@ public abstract class Logger
} }
// TODO: Hanmdle not found explicitly? // TODO: Hanmdle not found explicitly?
public final void removeTransform(MessageTransform transform) public final void removeTransform(Transform transform)
{ {
scope(exit) scope(exit)
{ {
@ -71,4 +71,38 @@ public abstract class Logger
this.transforms.linearRemoveElement(transform); this.transforms.linearRemoveElement(transform);
} }
// Logs an actual message
//
// This first passes it over all filters
// then to a transform and then copies
// to each handler
public final void log(Message message)
{
scope(exit)
{
this.lock.unlock();
}
this.lock.lock();
foreach(Filter filter; this.filters)
{
if(!filter.filter(message))
{
return;
}
}
Message curMessage = message;
foreach(Transform transform; this.transforms)
{
curMessage = transform.transform(curMessage);
}
foreach(Handler handler; this.handlers)
{
handler.handle(curMessage);
}
}
} }