smon/notification/pkg.go

62 lines
1.1 KiB
Go
Raw Normal View History

2024-05-05 10:10:04 +02:00
package notification
import (
// External
werr "git.gibonuddevalla.se/go/wrappederror"
// Standard
"log/slog"
"slices"
)
type Service interface {
SetLogger(*slog.Logger)
GetPrio() int
GetType() string
Send(string, []byte) error
}
type Manager struct {
services []Service
logger *slog.Logger
}
func NewManager(logger *slog.Logger) (nm Manager) {
nm.services = []Service{}
nm.logger = logger
return
}
func (nm *Manager) AddService(service Service) {
nm.services = append(nm.services, service)
slices.SortFunc(nm.services, func(a, b Service) int {
if a.GetPrio() < b.GetPrio() {
return -1
}
if a.GetPrio() > b.GetPrio() {
return 1
}
return 0
})
}
func (nm *Manager) Send(uuid string, msg []byte) (err error) {
for _, service := range nm.services {
nm.logger.Info("notification", "service", service.GetType(), "prio", service.GetPrio())
if err = service.Send(uuid, msg); err == nil {
break
} else {
data := struct {
UUID string
Msg []byte
}{
uuid,
msg,
}
werr.Wrap(err).WithData(data).Log()
}
}
return
}