Cybersecurity-Projects/PROJECTS/advanced/monitor-the-situation-dashb.../backend/internal/alerts/dispatcher.go

46 lines
861 B
Go

// ©AngelaMos | 2026
// dispatcher.go
package alerts
import (
"context"
"log/slog"
"github.com/carterperez-dev/monitor-the-situation/backend/internal/events"
)
// Dispatcher reads from a bus subscriber channel and pushes each event
// into the engine. Separate from the engine itself so the bus->engine
// wiring is testable in isolation.
type Dispatcher struct {
in <-chan events.Event
engine *Engine
logger *slog.Logger
}
func NewDispatcher(
in <-chan events.Event,
engine *Engine,
logger *slog.Logger,
) *Dispatcher {
if logger == nil {
logger = slog.Default()
}
return &Dispatcher{in: in, engine: engine, logger: logger}
}
func (d *Dispatcher) Run(ctx context.Context) error {
for {
select {
case <-ctx.Done():
return ctx.Err()
case ev, ok := <-d.in:
if !ok {
return nil
}
d.engine.Evaluate(ctx, ev)
}
}
}