feat(blogo): error handler in blogo construction
This commit is contained in:
@@ -45,6 +45,7 @@ func New(opts ...Opts) Blogo {
|
|||||||
if opt.MultiRenderer == nil {
|
if opt.MultiRenderer == nil {
|
||||||
opt.MultiRenderer = plugins.NewMultiRenderer()
|
opt.MultiRenderer = plugins.NewMultiRenderer()
|
||||||
}
|
}
|
||||||
|
|
||||||
if opt.FallbackSourcer == nil {
|
if opt.FallbackSourcer == nil {
|
||||||
opt.FallbackSourcer = plugins.NewEmptySourcer()
|
opt.FallbackSourcer = plugins.NewEmptySourcer()
|
||||||
}
|
}
|
||||||
@@ -52,13 +53,28 @@ func New(opts ...Opts) Blogo {
|
|||||||
opt.MultiSourcer = plugins.NewMultiSourcer()
|
opt.MultiSourcer = plugins.NewMultiSourcer()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if opt.FallbackErrorHandler == nil {
|
||||||
|
opt.FallbackErrorHandler = plugins.NewLoggerErrorHandler(
|
||||||
|
opt.Logger.WithGroup("errors"),
|
||||||
|
slog.LevelError,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
if opt.MultiErrorHandler == nil {
|
||||||
|
opt.MultiErrorHandler = plugins.NewMultiErrorHandler(plugins.MultiErrorHandlerOpts{
|
||||||
|
Assertions: opt.Assertions,
|
||||||
|
Logger: opt.Logger.WithGroup("errors"),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
return &blogo{
|
return &blogo{
|
||||||
plugins: []plugin.Plugin{},
|
plugins: []plugin.Plugin{},
|
||||||
|
|
||||||
fallbackRenderer: opt.FallbackRenderer,
|
fallbackRenderer: opt.FallbackRenderer,
|
||||||
multiRenderer: opt.MultiRenderer,
|
multiRenderer: opt.MultiRenderer,
|
||||||
fallbackSourcer: opt.FallbackSourcer,
|
fallbackSourcer: opt.FallbackSourcer,
|
||||||
multiSourcer: opt.MultiSourcer,
|
multiSourcer: opt.MultiSourcer,
|
||||||
|
fallbackErrorHandler: opt.FallbackErrorHandler,
|
||||||
|
multiErrorHandler: opt.MultiErrorHandler,
|
||||||
|
|
||||||
assert: opt.Assertions,
|
assert: opt.Assertions,
|
||||||
log: opt.Logger,
|
log: opt.Logger,
|
||||||
@@ -82,6 +98,11 @@ type Opts struct {
|
|||||||
plugin.Sourcer
|
plugin.Sourcer
|
||||||
plugin.WithPlugins
|
plugin.WithPlugins
|
||||||
}
|
}
|
||||||
|
FallbackErrorHandler plugin.ErrorHandler
|
||||||
|
MultiErrorHandler interface {
|
||||||
|
plugin.ErrorHandler
|
||||||
|
plugin.WithPlugins
|
||||||
|
}
|
||||||
|
|
||||||
Assertions tinyssert.Assertions
|
Assertions tinyssert.Assertions
|
||||||
Logger *slog.Logger
|
Logger *slog.Logger
|
||||||
@@ -100,6 +121,11 @@ type blogo struct {
|
|||||||
plugin.Sourcer
|
plugin.Sourcer
|
||||||
plugin.WithPlugins
|
plugin.WithPlugins
|
||||||
}
|
}
|
||||||
|
fallbackErrorHandler plugin.ErrorHandler
|
||||||
|
multiErrorHandler interface {
|
||||||
|
plugin.ErrorHandler
|
||||||
|
plugin.WithPlugins
|
||||||
|
}
|
||||||
|
|
||||||
server http.Handler
|
server http.Handler
|
||||||
|
|
||||||
@@ -151,10 +177,11 @@ func (b *blogo) Init() {
|
|||||||
|
|
||||||
sourcer := b.initSourcer()
|
sourcer := b.initSourcer()
|
||||||
renderer := b.initRenderer()
|
renderer := b.initRenderer()
|
||||||
|
errorHandler := b.initErrorHandler()
|
||||||
|
|
||||||
log.Debug("Constructing Blogo server")
|
log.Debug("Constructing Blogo server")
|
||||||
|
|
||||||
b.server = core.NewServer(sourcer, renderer, core.ServerOpts{
|
b.server = core.NewServer(sourcer, renderer, errorHandler, core.ServerOpts{
|
||||||
Assertions: b.assert,
|
Assertions: b.assert,
|
||||||
Logger: b.log.WithGroup("server"),
|
Logger: b.log.WithGroup("server"),
|
||||||
})
|
})
|
||||||
@@ -247,3 +274,46 @@ func (b *blogo) initSourcer() plugin.Sourcer {
|
|||||||
|
|
||||||
return b.multiSourcer
|
return b.multiSourcer
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (b *blogo) initErrorHandler() plugin.ErrorHandler {
|
||||||
|
b.assert.NotNil(b.plugins, "Plugins needs to be not-nil")
|
||||||
|
b.assert.NotNil(b.fallbackErrorHandler, "FallbackErrorHandler needs to be not-nil")
|
||||||
|
b.assert.NotNil(b.multiErrorHandler, "MultiErrorHandler needs to be not-nil")
|
||||||
|
b.assert.NotNil(b.log)
|
||||||
|
|
||||||
|
log := b.log.With()
|
||||||
|
log.Debug("Initializing Blogo ErrorHandler plugins")
|
||||||
|
|
||||||
|
errorHandlers := []plugin.ErrorHandler{}
|
||||||
|
|
||||||
|
for _, p := range b.plugins {
|
||||||
|
if s, ok := p.(plugin.ErrorHandler); ok {
|
||||||
|
log.Debug("Adding ErrorHandler", slog.String("errorHandler", s.Name()))
|
||||||
|
|
||||||
|
errorHandlers = append(errorHandlers, s)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(errorHandlers) == 0 {
|
||||||
|
log.Debug("No ErrorHandler avaiable, using %q as fallback",
|
||||||
|
slog.String("errorHandler", b.fallbackErrorHandler.Name()))
|
||||||
|
|
||||||
|
return b.fallbackErrorHandler
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(errorHandlers) == 1 {
|
||||||
|
log.Debug("Just one ErrorHandler found, using it directly",
|
||||||
|
slog.String("errorHandler", errorHandlers[0].Name()))
|
||||||
|
|
||||||
|
return errorHandlers[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Debug("Multiple ErrorHandlers found, using MultiSourcer to combine them",
|
||||||
|
slog.String("errorHandler", b.multiErrorHandler.Name()),
|
||||||
|
)
|
||||||
|
for _, s := range errorHandlers {
|
||||||
|
b.multiErrorHandler.Use(s)
|
||||||
|
}
|
||||||
|
|
||||||
|
return b.multiErrorHandler
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user