goext/exerr/errinit.go

89 lines
3.5 KiB
Go
Raw Normal View History

package exerr
2023-07-24 10:42:39 +02:00
import (
"fmt"
"gogs.mikescher.com/BlackForestBytes/goext/langext"
)
type ErrorPackageConfig struct {
2023-08-09 10:37:59 +02:00
ZeroLogErrTraces bool // autom print zerolog logs on .Build() (for SevErr and SevFatal)
ZeroLogAllTraces bool // autom print zerolog logs on .Build() (for all Severities)
RecursiveErrors bool // errors contains their Origin-Error
ExtendedGinOutput bool // Log extended data (trace, meta, ...) to gin in err.Output()
IncludeMetaInGinOutput bool // Log meta fields ( from e.g. `.Str(key, val).Build()` ) to gin in err.Output()
ExtendGinOutput func(err *ExErr, json map[string]any) // (Optionally) extend the gin output with more fields
ExtendGinDataOutput func(err *ExErr, depth int, json map[string]any) // (Optionally) extend the gin `__data` output with more fields
2024-01-13 14:10:25 +01:00
DisableErrorWrapping bool // Disables the exerr.Wrap()...Build() function - will always return the original error
}
type ErrorPackageConfigInit struct {
2023-08-21 13:27:36 +02:00
ZeroLogErrTraces *bool
ZeroLogAllTraces *bool
RecursiveErrors *bool
ExtendedGinOutput *bool
IncludeMetaInGinOutput *bool
2023-08-09 10:39:14 +02:00
ExtendGinOutput func(err *ExErr, json map[string]any)
ExtendGinDataOutput func(err *ExErr, depth int, json map[string]any)
2024-01-13 14:10:25 +01:00
DisableErrorWrapping *bool
}
var initialized = false
var pkgconfig = ErrorPackageConfig{
2023-08-09 10:39:14 +02:00
ZeroLogErrTraces: true,
ZeroLogAllTraces: false,
RecursiveErrors: true,
ExtendedGinOutput: false,
IncludeMetaInGinOutput: true,
ExtendGinOutput: func(err *ExErr, json map[string]any) {},
ExtendGinDataOutput: func(err *ExErr, depth int, json map[string]any) {},
2024-01-13 14:10:25 +01:00
DisableErrorWrapping: false,
}
// Init initializes the exerr packages
// Must be called at the program start, before (!) any errors
// Is not thread-safe
func Init(cfg ErrorPackageConfigInit) {
if initialized {
panic("Cannot re-init error package")
}
2023-07-24 11:42:52 +02:00
ego := func(err *ExErr, json map[string]any) {}
egdo := func(err *ExErr, depth int, json map[string]any) {}
if cfg.ExtendGinOutput != nil {
ego = cfg.ExtendGinOutput
}
if cfg.ExtendGinDataOutput != nil {
egdo = cfg.ExtendGinDataOutput
}
pkgconfig = ErrorPackageConfig{
2023-08-21 13:27:36 +02:00
ZeroLogErrTraces: langext.Coalesce(cfg.ZeroLogErrTraces, pkgconfig.ZeroLogErrTraces),
ZeroLogAllTraces: langext.Coalesce(cfg.ZeroLogAllTraces, pkgconfig.ZeroLogAllTraces),
RecursiveErrors: langext.Coalesce(cfg.RecursiveErrors, pkgconfig.RecursiveErrors),
ExtendedGinOutput: langext.Coalesce(cfg.ExtendedGinOutput, pkgconfig.ExtendedGinOutput),
IncludeMetaInGinOutput: langext.Coalesce(cfg.IncludeMetaInGinOutput, pkgconfig.IncludeMetaInGinOutput),
2023-08-09 10:39:14 +02:00
ExtendGinOutput: ego,
ExtendGinDataOutput: egdo,
2024-01-13 14:10:25 +01:00
DisableErrorWrapping: langext.Coalesce(cfg.DisableErrorWrapping, pkgconfig.DisableErrorWrapping),
}
initialized = true
}
2023-07-24 10:42:39 +02:00
2023-11-27 14:14:58 +01:00
func Initialized() bool {
return initialized
}
2023-07-24 10:42:39 +02:00
func warnOnPkgConfigNotInitialized() {
if !initialized {
fmt.Printf("\n")
fmt.Printf("%s\n", langext.StrRepeat("=", 80))
fmt.Printf("%s\n", "[WARNING] exerr package used without initializiation")
fmt.Printf("%s\n", " call exerr.Init() in your main() function")
fmt.Printf("%s\n", langext.StrRepeat("=", 80))
fmt.Printf("\n")
}
}